3
respostas

Persistência ManyToMany Spring Boot

Alguem poderia me explicar como realizo uma persistência NxN (ManyToMany) com spring boot?

3 respostas

Olá, Marcos! Claro, vou tentar te ajudar com a persistência ManyToMany no Spring Boot.

A persistência ManyToMany é usada quando você tem uma relação NxN entre duas entidades. Por exemplo, se você tem uma entidade Livro e uma entidade Autor, um livro pode ter muitos autores e um autor pode ter escrito muitos livros.

Aqui está um exemplo de como você pode fazer isso:

@Entity
public class Livro {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @ManyToMany
    @JoinTable(
      name = "livro_autor", 
      joinColumns = @JoinColumn(name = "livro_id"), 
      inverseJoinColumns = @JoinColumn(name = "autor_id"))
    private Set<Autor> autores = new HashSet<>();
    
    // getters e setters
}

@Entity
public class Autor {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @ManyToMany(mappedBy = "autores")
    private Set<Livro> livros = new HashSet<>();
    
    // getters e setters
}

Neste exemplo, a tabela livro_autor é a tabela de junção que mapeia a relação NxN entre Livro e Autor.

Por favor, note que a persistência ManyToMany pode ser um pouco complexa e pode ter implicações para o desempenho, então é sempre bom considerar se você realmente precisa de uma relação NxN ou se poderia modelar seus dados de uma maneira diferente.

Espero ter ajudado e bons estudos!

Boa noite Matheus.

Legal, fiz como vc me explicou, agora preciso executar o método save no repository. Pode me dizer como devo proceder?

Seria somente passar os objetos paras as Listas?

Já fez esse curso aqui? Se sim, segue o fluxo do curso, o que muda é só mente o ele te mando assima.

Tem que sincronizar isso com o maven do desse curso, os importes tambem estão nesse curso.

Mas tem que fazer um record dadosCadastrais, coloca todos os atributos que você tem do seu livro menos os ids "pois o id tem que ser colocado direto no banco."

public record DadosCadastroChecagem(

    @NotBlank // presta atenção aqui pois usar essa anotação com string String 
    String checagem,

    @NotNull
    ChecagemListAdicional checagemListAdicional

){

faz uma interface

import org.springframework.data.domain.*; 
import org.springframework.data.jpa.repository.JpaRepository;

public interface RepositoryChecagem extends JpaRepository<Checagem, Long>{
    
    Page<Checagem> findAllByAtivoTrue(Pageable pageable);

    Page<Checagem> findAllByAtivoFalse(Pageable pageable);

}

e por fim tem que fazer um controller mais ou menos assim.

@Autowired
    private RepositoryChecagem repository;

    @PostMapping
    @Transactional
    public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroChecagem dados, UriComponentsBuilder uriComponentsBuilder){
        var checagem = new Checagem(dados);
        repository.save(checagem);

        var uri = uriComponentsBuilder.path("/checagem/{id}").buildAndExpand(checagem.getId()).toUri();
        
        return ResponseEntity.created(uri).body(new DadosDetalhamentoAtualizadoChecagem(checagem));
    }