Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Quando considerar @ManyToMany ou @OneToMany e @ManyToOne para relacionamentos muitos pra muitos

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...

3 respostas

E aí, Thiago! Tudo certo, cara? =)

Cara, acho que não entendi muito bem a sua dúvida, você poderia reformulá-la, por favor? =D

Fábio

solução!

Fábio, na verdade observei que as vezes não queremos um @ManyToMany e sim um @OneToMany / @ManyToOne com uma tabela intermediária.

Thiago,

Exatamente isso... Devemos tomar muito cuidado ao pensar na modelagem das nossas classes, pois às vezes um relacionamento pode não fazer muito sentido, enquanto outro faz... Boa! =)

Abraços,

Fábio