使用ManyToMany的Spring Boot任务解决方案



这篇文章是给你写的,在夜色中徘徊。 您,只有孤独的萤火虫照亮您的道路。 通常,是一名研究Hibernate中的Spring Boot和ManyToMany关系的程序员。

他做了一个抽象音乐主题的测试任务:使用Java,Spring,Hibernate编写了一项服务,用于存储有关音乐家,歌曲,专辑的数据。 任务的一部分是创建“组合”和“表演者”类。 构图可以由许多表演者执行,并且表演者可以执行许多构图。 ManyToMany的典型双向态度。

Khasang课程讲授了如何避免使用DTO类在Spring周围产生休息请求,但是Spring Boot则是另一回事。 在俄语网站上,我看到诸如“是的,这都是基本知识”之类的答案,但没有具体解释。 我将举一个解决这个问题的例子。 完整的代码位于github,下面的链接。

首先,创建实体:People和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接口。

 @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批注扩展了Component批注,该批注允许实现的类成为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上为相同项目创建的类和接口的数量
春季项目中的课程春季靴类

祝大家编程成功。 等待您的评论。


二手文献:

  • Felipe Gutierrez Pro春季靴子
  • Craig Walls Spring in Action第5版

Source: https://habr.com/ru/post/zh-CN432318/


All Articles