Olá, estou desenvolvendo um projeto com hibernate e configurei o Hibernate para gerar as tabelas no banco. Até aí tudo bem. O que não estou entendendo é por que ele está criando duas tabelas para relacionamentos N:N. Por ex: em um relacionamento N:N entre a tab1 e a tab2 ele cria além dessas tabelas uma tab1_tab2 e outra tab2_tab1, onde as duas são idênticas. Isso é normal? Não dá pra fazer ele gerar apenas uma?
Hibernate Annotations - mappedBy e Geração das Tabelas
14 Respostas
ACDias,
Se poder postar o código, acredito que facilitará, para a ajuda.
Aproveitando a duvida do colega, também estou com um problema com o annotation, quando declaro uma classe e seus atributos como por exemplo:
@Entity
@Table (name=“usuario”)
public class Usuario implements Serializable {
private String nome;
@Id
private String username;
private String email;
private String cnpj;
private String senha;
private String confirmaSenha;
E não quero relacionar o atributo confirmaSenha com um campo do banco, esse atributo é só a titulo de validação. Como faço para indicar que esse atributo não faz parte de um campo da tabela. Ignorar ele???
Pois quando o Tomcat é inicializado e le a persistência esse campo ja esta sendo criado no banco.
Agradeço desde já
Obrigada
Se isto aconteceu é pq vc mapeou manytomany no dois beans eu acredito…
Se vc prefere utilizar apenas duas tabelas faça o seguinte
@Entity
public class Empresa
@Id
Integer id;
@ManyToOne
@Cascade(value={CascadeType.ALL})
private Funcionario funcionario = new Funcionario();
Isso diz q a tabela empresa terá uma foreign key da tabela funcionario
prontinho
Se isto aconteceu é pq vc mapeou manytomany no dois beans eu acredito…Sim! Eu utilizei o manytomany mesmo, mas é porque eu quero um relacionamento de muitos para muitos mesmo.
Ex:
@Entity
@Table ( name = "autor" )
@SequenceGenerator ( name = "sequence_autor" , sequenceName = "seq_autor_id" , allocationSize = 1 )
public class Autor
{
...
@ManyToMany ( cascade = CascadeType.ALL )
@JoinColumn ( nullable = true , name = "idbanca" )
private List < Banca > bancas;
...}
@Entity
@Table ( name = "bancas" )
@SequenceGenerator ( name = "sequence_bancas" , sequenceName = "seq_bancas_id" , allocationSize = 1 )
@Inheritance ( strategy = InheritanceType.JOINED )
public class Banca
{
...
@ManyToMany ( cascade = CascadeType.ALL )
@JoinColumn ( nullable = false , name = "idautor" )
protected List < Autor > autores;
...}
Com estas duas classes o Hibernate está gerando as tabelas:
bancas
autor
autor_bancas
bancas_autor
Estas duas últimas contém os mesmos atributos que são as chaves extrangeiras das outras duas tabelas.
Dayana,
E porque você criou um atributo no bean?
Por que não faz a validação por javascript, por exemplo (caso sua aplicação seja web)?
Caso o atributo seja apenas para um validação (confirmar se o usuário digitou a mesma senha), eu não acho legal criar um atributo.
Sim! Eu utilizei o manytomany mesmo, mas é porque eu quero um relacionamento de muitos para muitos mesmo.
Esse é o erro…vc só deve mapear em uma classe…ha menso que precisa dos dois relacionamentos… 
Então não devo usar relacionamento bidirecional?
Não ficaria mais difícil recuperar os valores nas consultas com relacionamentos unidirecionais?
Consegui consertar. Eu mapeei assim:
@ManyToMany ( cascade = CascadeType.ALL , mappedBy = "autores" )
@JoinTable ( name = "autor_banca" )
private List < Banca > bancas;
@ManyToMany ( cascade = CascadeType.ALL )
@JoinTable ( name = "autor_banca" )
protected List < Autor > autores;
No entanto me surgiu uma dúvida. Inicialmente eu havia declarado esse mappedBy na declaração dos 2 manytomany, no entanto foi gerado um erro dizendo que podia declarar só uma vez. Li na documentação da javax.persistence o que é esse atributo (que dizia: o campo que mantém o relacionamento), porém não entendi direito o que isso quer dizer. Em que esse mappedBy vai influenciar no relacionamento e na aplicação? Como saber em qual dos dois lados devo declarar o mappedBy (em Autor ou Banca)?
Obrigado
Olá Giulliano
Muito obrigada pela dica e já testei e funcionou…valeu mesmo
Olá Giulliano
Muito obrigada pela dica e já testei e funcionou…valeu mesmo

Consegui consertar. Eu mapeei assim:[code]@ManyToMany ( cascade = CascadeType.ALL , mappedBy = "autores...
Eu acho que o correto seria vc mapear apenas de um lado...normalmente não importa para o hibernate se vc tem duas ou uma tabela de relacionamento...quando vc fizer uma pesquisa e ele persistir os dados...vc nem vai saber qual o método ele utilizou para fazer o select..
então não se preocupe...faça apenas um mapeamento e teste...
Eu tive dúvidas nisso também… Seguinte, o lado em que você declarar o relacionamento eh o lado em que voce vai poder manipula-lo, ou seja, se vc tentar adicionar algo na lista do lado q ta o “mappedBy” essa informação não vai ser persistida.
Consegui consertar. Eu mapeei assim:
@ManyToMany ( cascade = CascadeType.ALL , mappedBy = "autores" ) @JoinTable ( name = "autor_banca" ) private List < Banca > bancas;
@ManyToMany ( cascade = CascadeType.ALL ) @JoinTable ( name = "autor_banca" ) protected List < Autor > autores;
No entanto me surgiu uma dúvida. Inicialmente eu havia declarado esse mappedBy na declaração dos 2 manytomany, no entanto foi gerado um erro dizendo que podia declarar só uma vez. Li na documentação da javax.persistence o que é esse atributo (que dizia: o campo que mantém o relacionamento), porém não entendi direito o que isso quer dizer. Em que esse mappedBy vai influenciar no relacionamento e na aplicação? Como saber em qual dos dois lados devo declarar o mappedBy (em Autor ou Banca)?Obrigado
O lado que você vai botar o mappedBy é o lado que “não é dono da relação”, ou seja, o lado que não contém a chave estrangeira. Isso serve para relacionamentos um para um e um para muitos. No seu caso, como é muitos para muitos, a especificação diz:
For many-to-many bidirectional relationships either side may be the owning side
Portanto, você pode usar em qualquer lado.
[]s
Aman Rathie