[RESOLVIDO] HIBERNATE - Dúvida sobre mapeamento @OneToMany vs @ManyToOne (Mesma Entidade)

1 resposta
guivirtuoso

Olá Pessoal,

Cenário:
Existe a entidade CadAssociado que representa pessoas, que podem ser Titulares ou Dependentes.

@ManyToOne

@Entity
@Table(name="cad_associado", schema="public")
public class CadAssociado {

    // Atributos como Nome, DtNascto, CPF, etc.....

   @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="id_titular")
   private CadAssociado titular;

   // getters & setters


}

No modelo acima, apenas uma tabela é criada no banco de dados (cad_associado), e sei se a pessoa é titular ou dependente pela coluna id_titular estar ou não preenchida.
A parte ruim desta modelagem é que se eu estiver com o Objeto do Titular, não tenho acesso prático aos dependentes (Ex: cadAssociado.getDependentes()). Me forcando a fazer uma consulta fora a parte, quando preciso de tal informação.

OK, vamos esquecer então essa coisa de eu informar quem é o Titular do meu cadastro, e vamos passar a ter uma Coleção de Dependentes p/ coisa ficar mais legível e prática.

@OneToMany

@Entity
@Table(name="cad_associado", schema="public")
public class CadAssociado {

    // Atributos como Nome, DtNascto, CPF, etc.....

   @OneToMany(fetch=FetchType.LAZY)
   private Collection<CadAssociado> dependentes;

   // getters & setters


}

Bom, até ai tudo bem, temos enfim um CadAssociado, que facilmente pode me dar os Dependentes (cadAssociado.getDependentes()), mas com essa anotação de OneToMany, o nosso amigo Hibernate criou uma segunda tabela, chamada cad_associado_cad_associado, e nesta tabela tem as duas colunas necessarias p/ este relacionamento (cad_associado_id e dependentes_id).

Minhas dúvidas são:

:arrow: Qual a melhor pratica para este caso (@OneToMany ou @ManyToOne)?

:arrow: Se eu realmente optar pela modelagem @OneToMany, tem como dizer p/ Hibernate não criar uma segunda tabela, e usar somente a que já existe, criando uma coluna de dependencia de cadastro, assim como quando mapiei sendo @ManyToOne?

Bom Pessoal, conto com a experiência de todos p/ me ajudar a definir esta situação de cadastro (Mestre/Detalhe).

:wink:

1 Resposta

guivirtuoso

Bom Dia,

Estive dando uma olhada com mais calma na situação e acabei encontrando onde estava o meu erro.

Primeiramente que p/ este tipo de situacao… tanto a declaração de @ManyToOne e @OneToMany ficam juntas na entidade, não se trata de escolher… usar uma ou outra.

E para que o Hibernate não crie uma tabela auxiliar como a cad_associado_cad_associado que eu havia comentado, basta adicionar a propriedade mappedBy na annotation @OneToMany fazendo referencia para o titular, que foi mapeado como @ManyToOne.

Assim o Hibernate mantem uma unica tabela desta entidade… com os devidos relacionamentos, e meu objeto… seja um titular ou um dependente, visualiza perfeitamente quem é seu Titular (no caso de ser um Dependente), e sabe exatamente quem são seus Dependentes (no caso de ser um Titular).

A Entidade ficou assim:

@Entity
@Table(name="cad_associado", schema="public")
public class CadAssociado extends Persistivel {

   // Atributos como Nome, DtNascto, CPF, etc.....

   @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="id_titular")
   private CadAssociado titular;

   @OneToMany(mappedBy="titular", fetch=FetchType.LAZY)
   private Collection<CadAssociado> dependentes;

   // getters & setters  

}

Vlw pessoal!

:wink:

Criado 16 de fevereiro de 2012
Ultima resposta 16 de fev. de 2012
Respostas 1
Participantes 1