Relacional

ManyToMany

Explorando a relação entre classes e entidades

Explicação

A anotação @ManyToMany do JPA (Java Persistence API) é usada para representar um relacionamento entre duas entidades no qual cada instância de uma entidade pode estar associada a várias instâncias da outra entidade, e vice-versa. Esse tipo de relacionamento é bidirecional, ou seja, ambas as entidades podem ter acesso umas às outras.

@ManyToMany

Exemplo

Vamos imaginar que agora a empresa solicitou uma nova funcionalidade onde os seus clientes possam selecionar produtos para torná-los como favoritos ou como conhecemos em algumas plataformas como a lista do desejos. Por se tratar de uma relacionamento onde muitos clientes poderão adicionar muitos produtos, logo muitos produtos estarão na lista de desejos de muitos clientes, este relacionamento é conhecido como muitos-para-muitos.


import jakarta.persistence.*;

@Entity
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String nome;
    // Lombok ou Getters e Setters
}

Contextualização

  1. Anotação @ManyToMany:
  • Essa anotação é usada tanto na classe Cliente quanto na classe Produto (Opcionalmente).
  • No lado da entidade Cliente, a anotação é usada para indicar que um cliente pode ter muitos produtos favoritos.
  • Na classe Produto, o relacionamento é bidirecional, então a anotação @ManyToMany é usada com o atributo mappedBy, que aponta para a coleção produtosFavoritos na classe Cliente. Isso estabelece que a tabela intermediária será gerenciada pela classe Cliente.
  1. Tabela Intermediária:
  • A tabela intermediária que vai armazenar as associações entre clientes e produtos é especificada com a anotação @JoinTable no lado da classe Cliente.
  • Essa tabela será chamada cliente_produto e terá duas colunas:
    • cliente_id (chave estrangeira para a tabela Cliente)
    • produto_id (chave estrangeira para a tabela Produto)
  1. @JoinColumn e inverseJoinColumns:
  • @JoinColumn(name = "cliente_id") especifica a coluna na tabela intermediária que faz referência ao Cliente.
  • @JoinColumn(name = "produto_id") faz referência à coluna da tabela intermediária que se relaciona com Produto.
  1. Bidirecionalidade:
  • O lado da classe Produto usa o atributo mappedBy = "produtosFavoritos". Isso indica que a tabela intermediária é controlada pela classe Cliente, ou seja, a associação é gerenciada a partir do lado da classe Cliente, enquanto o lado da classe Produto apenas referencia esse relacionamento.

Como funciona a relação

  • Quando um cliente favoritar um produto, o relacionamento é adicionado à tabela intermediária cliente_produto, armazenando o cliente_id e o produto_id.
  • Da mesma forma, ao favoritar vários produtos, o cliente estará associado a esses produtos através da tabela intermediária, e o produto, por sua vez, será associado ao cliente na tabela de associação.

Conclusão

O relacionamento @ManyToMany é muito útil para representar situações onde entidades possuem relações mútuas entre si, como o exemplo de clientes e produtos favoritos. A anotação permite que você gerencie essas associações de maneira simples, com a ajuda de uma tabela intermediária que facilita o gerenciamento das chaves estrangeiras.

No exemplo de clientes e produtos favoritos, um cliente pode ter vários produtos favoritos, e um produto pode ser favoritado por vários clientes. Esse é um relacionamento de muitos para muitos, que pode ser modelado usando @ManyToMany.