Solução de tarefa Spring Boot com ManyToMany



O artigo é endereçado a você, vagando na escuridão da noite. Você, cujo caminho é iluminado apenas por vaga-lumes solitários. Em geral, um programador que estuda o Spring Boot e o relacionamento ManyToMany no Hibernate.

Ele fez uma tarefa de teste sobre um tema musical abstrato: escreva um serviço para armazenar dados sobre músicos, músicas, álbuns, usando Java, Spring, Hibernate. Parte da tarefa foi a criação das classes “Composições” e “Artistas”. Uma composição pode ser executada por muitos artistas e um artista pode executar muitas composições. Atitude bidirecional típica de ManyToMany.

Os cursos de Khasang ensinaram como evitar solicitações de descanso em torno do Spring usando a classe DTO, mas o Spring Boot é uma história diferente. Em sites em russo, vi respostas como "Sim, é tudo elementar", mas sem explicações específicas. Vou dar um exemplo de solução desse problema. O código completo está localizado no github, link abaixo.

Primeiro, crie Entity: People e SongPlayers. Getters e setters são omitidos por questões de brevidade.

@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; //. . . . . . . . . } 

Em seguida, criamos interfaces de repositório para a classe 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); } 

E para a classe SongPlayers

 @Repository public interface SongPlayersRepository extends JpaRepository<SongPlayers, Long> { List<SongPlayers> findSongPlayersBySong(String song); List<SongPlayers> findSongPlayersByComposer(String composer); List<SongPlayers> findSongPlayersByPoet(String poet); } 

A anotação Repository estende a anotação Component , que permite que a classe implementada seja um bean e, consequentemente, faça uma ligação automática.

A extensão da interface JpaRepository permite executar as operações CRUD necessárias sem descrição adicional e outras coisas úteis.

Agora você precisa criar classes de DTO para Entity People e SongPlayers. Aqui vou citar apenas o PeopleDTO para não bagunçar o artigo. Getters e setters novamente abaixados.

 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; } //. . . . . . . . . } 

Por analogia, a classe SongPlayersDTO também é criada. Selecionamos os campos necessários para exibir na resposta restante.

Crie um controlador para pessoas. Atenção, cuidado com as mãos!

 @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()); } //. . . . . . . } 

Sim, você diz. Isso não vai funcionar. Onde está a implementação da interface PeopleRepository?
Funcionará, a classe PeopleRepository é criada em tempo real! Simplesmente fantástico.

Agora compare o número de classes e interfaces criadas para um projeto idêntico no Spring e Spring Boot
aulas em um projeto de primaveraaulas na bota primavera

Desejo a todos uma programação bem-sucedida. Aguardando seus comentários.


Literatura usada:

  • Bota de primavera Felipe Gutierrez Pro
  • Craig Walls Spring em ação 5ª edição

Source: https://habr.com/ru/post/pt432318/


All Articles