Quando considerar @ManyToMany ou @OneToMany e @ManyToOne para relacionamentos muitos pra muitos
Oi pessoal, minha dúvida/ideia é bem parecida com do tópico: https://cursos.alura.com.br/forum/topico-como-adicionar-mais-um-atributo-utilizando-relacionamento-manytomany-37297
E vi lá a resposta e foi satisfatória, o problema é o conceito mesmo.
O relacionamento que ele citou lá no tópico é Muitos Para Muitos, mas não é @ManyToMany, isto é no conceito é Muitos para Muitos mas não é verdade quando implementamos isso nas entidades colocando @ManyToMany.
Acredito que essa confusão não seja só vilã para mim, mas para todos que iniciam com isso.
Sei que @ManyToMany cria uma tabela intermediaria que pega os IDs das tabelas relacionadas, ótimo, mas quando quero um Muitos pra Muitos e passar outros dados nessa tabela, a ideia é fazer conforme foi proposto pelo Fabio, @OneToMany e @ManyToOne.
Exemplo:
@Entity
public class ComposicaoServico {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "nome")
private String nome;
@OneToMany(mappedBy = "composicaoServico", cascade = {CascadeType.ALL, CascadeType.REMOVE}, fetch = FetchType.EAGER, orphanRemoval=true)
private Set<ItemInsumoMaterial> materiais = new HashSet<ItemInsumoMaterial>();
}
public class ItemInsumoMaterial {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NumberFormat(pattern = "#,##0.0000")
@Column(name="valor_coeficiente")
private BigDecimal quantidade;
// @Column(name = "valor_unitario") // Para pensar
// private BigDecimal valorUnitario;
@ManyToOne
@JoinColumn(name = "id_insumo_material")
private InsumoMaterial insumoMaterial;
}
public class InsumoMaterial {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message= "Nome é obrigatório")
private String nome;
@NotNull(message = "Unidade deve ser selecionada")
@Enumerated(EnumType.STRING)
private EnumUnidade unidade;
}
Foram omitidos vários atributos e get/set(ers)
Mas tem um exemplo de Muita Composições terem Muitos Insumos, mas precisa ter uma intermediaria ali para dar a quantidade de insumo e tals...