Hibernate Annotations - mappedBy e Geração das Tabelas

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?

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

[quote]Se isto aconteceu é pq vc mapeou manytomany no dois beans eu acredito…[/quote]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 &lt Banca &gt 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 &lt Autor &gt 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.

[quote=ACDias]Sim! Eu utilizei o manytomany mesmo, mas é porque eu quero um relacionamento de muitos para muitos mesmo.
[/quote]

Esse é o erro…vc só deve mapear em uma classe…ha menso que precisa dos dois relacionamentos… :wink:

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 &lt Banca &gt bancas;

@ManyToMany ( cascade = CascadeType.ALL ) @JoinTable ( name = "autor_banca" ) protected List &lt Autor &gt 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

[quote=dayana]Olá Giulliano
Muito obrigada pela dica e já testei e funcionou…valeu mesmo[/quote]

:wink:

[quote=ACDias]Consegui consertar. Eu mapeei assim:

[code]@ManyToMany ( cascade = CascadeType.ALL , mappedBy = "autores…[/quote]

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.

[quote=ACDias]Consegui consertar. Eu mapeei assim:

@ManyToMany ( cascade = CascadeType.ALL , mappedBy = "autores" ) @JoinTable ( name = "autor_banca" ) private List &lt Banca &gt bancas;

@ManyToMany ( cascade = CascadeType.ALL ) @JoinTable ( name = "autor_banca" ) protected List &lt Autor &gt 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[/quote]

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