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?
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 ?
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.
é… 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
[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.
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…
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…