Problemas com relação ManyToMany [Resolvido]

4 respostas
gilvanandre

Seguinte pessoal.
Tenho uma relação ManyToMany, mas estou com um problema, no momento de realizar a criação da tabela (utilizando hibernate), ele está criando quatro FOREIGN KEYs, quando deveria ciar apenas 2

Alguém sabe me dizer o que pode ser?

Codigos.

Tabela Finalidade.
@Entity
public class Finalidade implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo_finalidade;
    
    @ManyToMany
    @JoinTable(name = "finalidademensagem", joinColumns = {
        @JoinColumn(name = "codigo_finalidade")},
    inverseJoinColumns = {
        @JoinColumn(name = "codigo_infnfe")})
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private Collection<InfNfe> mensagens;
   
    Get e Set...

}
Tabela InfNfe
@Entity
public class InfNfe implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo_infnfe;
    @Lob
    @Column(name = "titulo", nullable = false)
    private String titulo;
    @Lob
    @Column(name = "mensagem", nullable = false)
    private String mensagem;
    @Column(name = "status", nullable = true)
    private boolean status;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "loginestab")
    private LoginEstab loginestab;
    
    @ManyToMany
    @JoinTable(name = "finalidademensagem", joinColumns = {
        @JoinColumn(name = "codigo_infnfe")},
    inverseJoinColumns = {
        @JoinColumn(name = "codigo_finalidade")})
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private Collection<Finalidade> finalidades;
    

   Get e Set
}
Tabela FinalidadeMensagemPK
@Embeddable
public class FinalidadeMensagemPK implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name="codigo_infnfe")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private InfNfe codigo_infnfe;
    
    @ManyToOne
    @JoinColumn(name="codigo_finalidade")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Finalidade finalidade;

}

4 Respostas

Hebert_Coelho

use o mappedBy.

Aqui explica como fazer corretamente o relacionamento: JPA: Mini Livro - Primeiros passos e conceitos detalhados

gilvanandre

Hebert Coelho:
use o mappedBy.

Aqui explica como fazer corretamente o relacionamento: JPA: Mini Livro - Primeiros passos e conceitos detalhados

Acontece a mesma coisa
Ficaria assim o:

Finalidade

@ManyToMany
    @JoinTable(name = "finalidademensagem", joinColumns = @JoinColumn(name = "codigo_finalidade"), inverseJoinColumns = @JoinColumn(name = "codigo_infnfe"))
    private List<InfNfe> mensagens;

Mensagens

@ManyToMany(mappedBy = "mensagens")
    private List<Finalidade> finalidades;

SQL de criação

CREATE TABLE finalidademensagem
(
  codigo_infnfe bigint NOT NULL,
  codigo_finalidade bigint NOT NULL,
  CONSTRAINT finalidademensagem_pkey PRIMARY KEY (codigo_infnfe , codigo_finalidade ),
  CONSTRAINT fk2332af5c4fcd146 FOREIGN KEY (codigo_infnfe)
      REFERENCES infnfe (codigo_infnfe) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk2332af5cf862b1f0 FOREIGN KEY (codigo_finalidade)
      REFERENCES finalidade (codigo_finalidade) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkb1948f1c4fcd146 FOREIGN KEY (codigo_infnfe)
      REFERENCES infnfe (codigo_infnfe) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkb1948f1cf862b1f0 FOREIGN KEY (codigo_finalidade)
      REFERENCES finalidade (codigo_finalidade) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

Observe no sql acima que ele cria 4 FOREIGN KEYs, quando o certe seria apenas 2. Ou seja, ele duplica as FOREIGNs

Obrigado

gilvanandre

Hebert Coelho:
use o mappedBy.

Aqui explica como fazer corretamente o relacionamento: JPA: Mini Livro - Primeiros passos e conceitos detalhados

Consegui resolver o problema com a relação ManyToMany com campos adicionais do Mini Livro, não é bem o que eu precisava mas ta funcionando, e é o que importa.
:smiley:

Obrigado, alias… Muito boa as suas explicações!

Hebert_Coelho

gilvanandre:
Hebert Coelho:
use o mappedBy.

Aqui explica como fazer corretamente o relacionamento: JPA: Mini Livro - Primeiros passos e conceitos detalhados

Consegui resolver o problema com a relação ManyToMany com campos adicionais do Mini Livro, não é bem o que eu precisava mas ta funcionando, e é o que importa.
:smiley:

Obrigado, alias… Muito boa as suas explicações!

Uia, que bom! Parabéns. [=

Valeu pelo apoio.

Criado 18 de março de 2013
Ultima resposta 19 de mar. de 2013
Respostas 4
Participantes 2