OneToOne e OneToMany na mesma entidade

4 respostas
M

Boa noite pessoal, tenho o steguinte cenário:

1. public class Categoria {  
   2.   
   3.     private Integer idCategoria;  
   4.   
   5.     @OneToOne(mappedBy="categoria", fetch=FetchType.LAZY)  
   6.     private DadoCategoria dadoCategoria;  
   7.   
   8.     @OneToMany(mappedBy="categoria", cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
   9.     private List<DadoCategoria> dadosCategoria;  
  10.   
  11.    ....  
  12. }  
  13.   
  14. public class DadoCategoria {  
  15.   
  16.     private Integer idDadoCategoria;  
  17.   
  18.     @ManyToOne(fetch=FetchType.LAZY, optional=false)  
  19.     private Categoria categoria;  
  20.   
  21.     @ManyToOne(fetch=FetchType.LAZY, optional=false)  
  22.     private Localizacao localizacao;  
  23.       
  24.    ...  
  25. }  
  26.   
  27. public class Localizacao implements Serializable {  
  28.   
  29.     private Integer idLocalizacao;  
  30.   
  31.    ....  
  32. }

Um categoria pode ter várias localizações, mas em 100% das vezes ela é exibida somente em uma localização.
Então eu tenho a lista de dados da categoria em vários idiomas mas seleciono apenas uma para exibir (por isso o OneToOne).
Se considerar somente o relacionamento OneToMany terei que inicializar toda vez a coleção, o que nao e muito viável.
Utilizando o relacionamento OneToOne somente consigo carregar corretamento utilizando criteria, fora isso o hibernate diz que há mais de um mesmo id para um dado da categoria para uma relação um-para-um.
Acontece que eu nao posso utilizar lazy de forma alguma, pois o hibernate sempre carrega adiantado relacionamentos oneToOne, e ao carregar o erro é lançado…

Alguem teve algum problema parecido?

4 Respostas

walacy

Jah tentou aplicar um filter no “onetoone” ?

Eu particularmente, não modelaria assim… achei muito estranho…

Ou você tem varios ou um… nunca os dois, como vc ta fazendo…

M

Também acho estranho desta forma, estou fazendo alguns testes.
Uma opção que vi foi remover o OneToOne e criar um Bean que junte os dados da categoria e dos dados dela, dai aplico um transformador de resultados AliasToBeanResultTransformer.
Esta opção é melhor também em questão de desenpenho, pois terei que carregar todas as categorias em memória.
Não sei se é a melhor solução, mas funciona corretamente.
Abraços

mrrbigu

Essa modelagem está muito estranha, as classes das entidades não tem chave primária assim mesmo?

M

Elas tem sim, somente ocultei as anotações…
abraços

Criado 11 de março de 2010
Ultima resposta 16 de mar. de 2010
Respostas 4
Participantes 3