Mapeamento one to one avançado hibernate

Olá,

Estou trabalhando em um sistema onde a modelagem do banco foi feita antes do mapeamento de objetos. O banco possui várias relações um para muitos que para o sistema deveria ser um para um.

Exemplo: Um PLANO possui uma VIGENCIA so que a nivel de banco a chave é um para muitos, pois o plano pode ter várias vigencias mas apenas uma ativa. A vigencia ativa seria a que possui o campo DATA_FIM_VIGENCIA nulo.

Alguem sabe se existe alguma forma de eu mapear no hibernate essa relação de modo que ele so me retorne um resultado? Que ao fazer o JOIN ele adicione na clausula ON dataFinalVigencia = null por exemplo?

Obrigado!

Oi ronaldo, pela modelagem do banco, realmente vai haver a possibilidade de retornar mais de um resultado, mas quando voce fizer uma query filtrando por dataFinalVigencia = null vai trazer um resultado só já que o dominio de negocio funciona assim.

Não estou entendendo o problema ainda, poderia explicar o porque que mesmo com a condicao dataFinalVigencia = null voce acha que podera ter mais de um resultado por favor ?

Abraços

kamikazeishida,

Na verdade se eu utilizar um HQL, EJBQL eu consigo recuperar sem problemas, mas o que eu quero é poder esse mapeamento diretamente na minha entidade para que eu possa utitlizar como um bean do JSF.

Hoje na minha entidade eu so possuo um “getListaVigencia()” eu gostaria de ter tambem um getVigencia() que me retornasse apenas a vigencia ativa, apenas mapeando o atributo com annotations do hibernate.

Espero que eu tenha sido claro.

Obrigado pela atenção!

Valeu, entendi

é… tem um problema ai, se mapear @OneToOne e obter resultado com um getSingleResult(), vai dar erro.

Para ter garantia que tudo vai ficar legal, tanto getListaVigencia() quanto getVigencia terão que obter valores já processados de uma HQL especifica pra cada caso.

Se tentar recuperar os valores por cascade vai dar erro

Na verdade estava respondendo a questao do jvlouvem, desculpe.

Estou vendo como funciona a utilização da anotação @Formula do hibernata, quem sabe pode me ajudar…

Obrigado pela atenção de voces!

[quote=ronaldocwb]Na verdade estava respondendo a questao do jvlouvem, desculpe.

Estou vendo como funciona a utilização da anotação @Formula do hibernata, quem sabe pode me ajudar…

Obrigado pela atenção de voces![/quote]

@Formula funciona apenas para colunas simples, nunca para entidades. Você pode por exemplo fazer um count em outra tabela e tal… mas não pode retornar com @Formula uma entidade.

Não vejo problemas no one-to-one ao invés do one-to-many. Se não for encontrado resultados, ele retorna null. Porém você tem que garantir que nunca venha mais de um resultado, senão dá uma exception.

Otavio,

Ai que está o problema, pelo join entre os IDs ele pode retornar mais de um resultado sim. O que posso garantir é que não terei duas vigencias vinculadas a um plano com a dataFinalVigencia nula. Eu precisava de algum artificio que me permita informar que ele deveria colocar no join essa condição…

Att.

quando voce faz uma query: select p from Plano p where p.vigencia.dataFinalVigencia is null, não funciona ?

Sim, funciona!

Mas para realmente facilitar minha vida eu precisava disso como um mapeamento, simulando um one to one mesmo. Assim eu consigo colocar meu bean Vigencia na tela do JSF sem ter que iterar e tratar lista…

Ronaldo, se não me engano tem um @Where que pode funcionar nesse caso.

Voce tem algum exemplo de uso desse @Where?

Não estou encontrando e os que encontrei não me ajudou muito…

Obrigado

Ola,

ronaldocwb vc conseguiu resolver este problema?

grato…

de uma olhada nesse link

http://tech.sxinfo.net/UserFiles/mxk/File/eBook/java/hibernate/Manning%20-%20Hibernate%20in%20Action.pdf

annotations do hibernate nao manjo =(