Hibernate - duvida arquitetura (problemas com lazy, vários selects sem noção, etc)

8 respostas
C

Galera,
Sou novo no hibernate e aqui no forum tambem.

Bom o problema é o seguinte: Estou utilizando uma arquitetura não muito convencional. Talvez não seja a melhor mas não posso muda-la agora (nem gostaria de fazer isso por vários motivos). Mas estou utilizando o hibernate para fazer a persistencia e creio que estou usando de forma errada porque estou tendo vários problemas. Mas vamos aos fatos:

Arquitetura: Consiste de uma espécie de struts para fazer a parte MVC. Digamos que a lógica das telas fica em um Action. Desse Action eu faço uma chamada remota através de uma interface para o meu DAO. Talvez aí esteja o problema, mas o que acontece é que so tenho um unico EJB no AppServer e esse é como um facade para os DAOs. Ele é responsavel por controlar as transações, tudo abaixo dele só recebe commit ou rolback após voltar nele. Até ai tudo bem, problema que estou tendo é quando dou get em uma lista Lazy la no Action. Aí eu tomo pau de LazyInitializer por causa da sessão fechada (sessões hibernate são abertas no DAO via hibernateTemplate). Achei um jeito de evitar isso dando get em tudo que preciso na tela de dentro do DAO antes de retornar a entidade. Mas acho que não deveria ser assim.
De qualquer forma, minhas entidades tambem são usadas nos JSPs. Quando eu dou get em uma lista la me ferro tambem. Acho que não deveria ser assim. Fora que uma consulta simples a um objeto gera de 1 a 20 querys iguais numa mesma operação.
Como vocês usam o hibernate com uma aplicação web usando Struts por exemplo? Eu estou achando que as entidades não devem ser devolvidas para a camada visual porque elas possuem o proxy dinamico para utilizar o Lazy. Usar eager em tudo é desaconselhavel então estou meio perdido. Os exemplos na web são simples de mais para responderem minhas duvidas. Conto com a ajuda de alguem com paciência para ler tudo isso.

valew.

8 Respostas

jgbt

bom, primeiro de tudo, para abrir a sessão do hibernate em apps web de uma olhada em aqui .

[]'s

A

Utilize filtros que abram e fechem a sessão quando há requisições de dados pela camada de apresentação. Na verdade, vocÊ pode abrir as sessions pelo DAO, mas não fechá-las. Quem faz isso é o seu HttpFilter no pós processamento. Para não acoplar sua Servlet com a Session do Hibernate, utilize a interface ThreadLocal.

C

Agradeço a ajuda mas não gostaria de abrir a Sessão do hibernate na view, e nem fechar ela la. Não existe uma forma de manipular isso fora da view? Eu sou mesmo obrigado a fechar a Sessão na view? Não me parece uma boa idéia deixar a responsabilidade de comitar as coisas a um Servlet. Isso deveria ser responsabilidade do JTA não? Descupem se estou falando besteira.

A

Você pode usar a JTA, mas não recomendo pois o Hibernate já gerencia isso tuso (e mexer nessa API diretamente é bem chato). Na verdade não há outro modo de fazer sem utilizar um InterceptingFilter pois o Hibernate usa o conceito de lazy-loading e toda vez que você for navegar "por dentro " do objeto ele vai fazer uma SELECT.
Dá uma olhada nisso aqui:
http://www.hibernate.org/43.html

J

Por gentileza, istou iniciando no desenvolvimento java com hibernate to meio enrolado , ja tentei executar alguns exemplos porem sem sucesso, mais o que mais esta me deixando irritado e que tem um metudo que eu nao encontro na api do hibernate que seria o “find(String)”, esse e o unico metudo que esta errado no codigo não pode intender o por que ?, alguem sabe ?

C

Não gostei dessa idéia de levar o proxy para a camada visual, pq ele atravessa as camadas para fazer os selects do lazy.

Estou pensando em tirar o hibernate. Acho que nao funciona para a arquitetura que estou usando infelizmente.

plentz

Na verdade, antes de pensar em tirar o Hibernate, você deveria re-pensar a sua arquitetura.

C

Não posso ela não é minha, é do arquiteto que odeia hibernate.

Criado 27 de março de 2007
Ultima resposta 17 de abr. de 2007
Respostas 8
Participantes 5