Hibernate Annotations - mappedBy e Geração das Tabelas

14 respostas
ACDias

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?

14 Respostas

fsquadro

ACDias,

Se poder postar o código, acredito que facilitará, para a ajuda.

D

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

Giulliano

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

Giulliano

prontinho

ACDias

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

fsquadro

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.

Giulliano

ACDias:
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… :wink:

ACDias

Então não devo usar relacionamento bidirecional?
Não ficaria mais difícil recuperar os valores nas consultas com relacionamentos unidirecionais?

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

D

Olá Giulliano
Muito obrigada pela dica e já testei e funcionou…valeu mesmo

Giulliano

dayana:
Olá Giulliano
Muito obrigada pela dica e já testei e funcionou…valeu mesmo

:wink:

Giulliano
ACDias:
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...

T

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.

Amanweb

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

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

Criado 24 de julho de 2007
Ultima resposta 1 de ago. de 2007
Respostas 14
Participantes 6