記事はあなたに宛てられ、夜の闇をさまよう。 あなた、その道は孤独なホタルだけに照らされています。 一般に、HibernateでSpring BootとManyToManyの関係を研究するプログラマー。
彼は抽象的な音楽テーマでテストタスクを行いました。Java、Spring、Hibernateを使用して、ミュージシャン、歌、アルバムに関するデータを保存するサービスを作成します。 課題の一部は、「作曲」および「演奏者」クラスの作成でした。 作曲は多くの演奏者が実行でき、演奏者は多くの作曲を実行できます。 ManyToManyの典型的な双方向の態度。
Khasangのコースでは、DTOクラスを使用して、Springを巡る休息要求を回避する方法を学びましたが、Spring Bootは別の話です。 ロシア語のサイトでは、「はい、それはすべて初歩的です」というような答えがありましたが、具体的な説明はありませんでした。 この問題を解決する例を示します。 完全なコードはgithubに投稿されています。以下のリンク。
最初に、Entity:People and SongPlayersを作成します。 簡潔にするために、ゲッターとセッターは省略されています。
@Entity public class People { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String human; // @ManyToOne(cascade = CascadeType.ALL) private RockGroups rockGroups; // @ManyToMany(mappedBy = "songInstrumentalist",fetch = FetchType.EAGER) private List<SongPlayers> songItems; public People(){} public People(long id, String human){ this.id = id; this.human = human; } //. . . . . . . . . }
@Entity public class SongPlayers { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String song; // private String composer; // private String poet; // private String album; // // @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<People> songInstrumentalist; //. . . . . . . . . }
次に、Peopleクラスのリポジトリインターフェイスを作成します。
@Repository public interface PeopleRepository extends JpaRepository<People, Long> { @Query("select h from People h where h.human=?1") List<People> searchByHuman(String human); List<People> findPeopleByHuman(String human); }
SongPlayersクラスの場合
@Repository public interface SongPlayersRepository extends JpaRepository<SongPlayers, Long> { List<SongPlayers> findSongPlayersBySong(String song); List<SongPlayers> findSongPlayersByComposer(String composer); List<SongPlayers> findSongPlayersByPoet(String poet); }
Repositoryアノテーションは、 コンポーネントアノテーションを拡張します 。これにより、実装されたクラスがBeanになり、それに応じて自動配線されます。
JpaRepositoryインターフェースの拡張により、追加の説明やその他の有用なことなく、必要なCRUD操作を実行できます。
ここで、Entity PeopleとSongPlayersのDTOクラスを作成する必要があります。 ここでは、記事を煩雑にしないためにPeopleDTOのみを引用します。 ゲッターとセッターが再び低下しました。
public class PeopleDTO { private long id; private String human; private RockGroups rockGroups; private List<SongPlayersDTO> songPlayersList; public List<PeopleDTO> getPeopleDTOList(List<People> peopleList){ List<PeopleDTO> peopleDTOList = new ArrayList<>(); for (People people : peopleList){ songPlayersList = new ArrayList<>(); PeopleDTO peopleDTO = new PeopleDTO(); peopleDTO.setId(people.getId()); peopleDTO.setHuman(people.getHuman()); peopleDTO.setRockGroups(people.getRockGroups()); for (SongPlayers songPlayers : people.getSongItems()){ SongPlayersDTO songPlayersDTO = new SongPlayersDTO(); songPlayersDTO.setId(songPlayers.getId()); songPlayersDTO.setSong(songPlayers.getSong()); songPlayersDTO.setPoet(songPlayers.getPoet()); songPlayersDTO.setComposer(songPlayers.getComposer()); songPlayersDTO.setAlbum(songPlayers.getAlbum()); songPlayersList.add(songPlayersDTO); } peopleDTO.setSongPlayersList(songPlayersList); peopleDTOList.add(peopleDTO); } return peopleDTOList; } //. . . . . . . . . }
同様に、SongPlayersDTOクラスも作成されます。 残りの回答に表示する必要なフィールドを選択します。
人のためのコントローラーを作成します。 注意、手を見てください!
@RestController @RequestMapping("/people") public class PeopleController { @Autowired private PeopleRepository repository; @GetMapping("/all") public List<PeopleDTO> getAllPeople(){ PeopleDTO peopleDTO = new PeopleDTO(); return peopleDTO.getPeopleDTOList(repository.findAll()); } //. . . . . . . }
ええ、あなたは言います。 これは機能しません。 PeopleRepositoryインターフェースの実装はどこにありますか?
動作します。PeopleRepositoryクラスはその場で作成されます! ただ素晴らしい。
SpringとSpring Bootの同一プロジェクト用に作成されたクラスとインターフェースの数を比較します
春のプロジェクトのクラス | 春のブーツのクラス |
---|---|
プログラミングの成功をお祈りします。 あなたのコメントを待っています。
使用された文献:
- フェリペグティエレスプロスプリングブーツ
- Craig Walls Spring in action 5th edition