Controle de session no Hibernate

14 respostas
brucsantos

Bom dia!

Estou tendo o seguinte erro:

29/07/2010 11:06:05 org.hibernate.LazyInitializationException <init>
SEVERE: failed to lazily initialize a collection of role: br.com.mercadolivre.consultas.domain.ConsultComplementation.otherTransactionsML, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.mercadolivre.consultas.domain.ConsultComplementation.otherTransactionsML, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
	at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:483)
	at br.com.mercadolivre.consultas.config.Application.config(Application.java:67)
	at br.com.mercadolivre.consultas.config.Application.getSessionFactory(Application.java:37)
	at br.com.mercadolivre.consultas.servlet.ConsultasContextListener.contextInitialized(ConsultasContextListener.java:47)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

Sei que o erro ocorre por que capturei o objeto e quando vou chamar um metodo que está como LAZY a sessão está fechada!

Minha duvida é a seguinte:

Esse erro está dando na pagina jsp quando vou carregar as informações que estão em LAZY. Como vocês fariam para controlar a sessão do hibernate sem deirar aberta e não gerando esse erro e sem alterar para EAGER??

Abraços

14 Respostas

W

Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

brucsantos

wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

lelodois

brucsantos:
wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

Entenda o problema…
http://blog.caelum.com.br/2009/10/13/enfrentando-a-lazyinitializationexception-no-hibernate/

brucsantos

lelodois:
brucsantos:
wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

Entenda o problema…
http://blog.caelum.com.br/2009/10/13/enfrentando-a-lazyinitializationexception-no-hibernate/

Bom dia lelodois!

Acho que você não entendeu minha duvida… Eu sei qual é o problema e sei uma forma de resolver. E duvida é saber se existe outra forma ou se alguem fez de outra forma.

Abraços.

Se alguem tiver alguma ideia…

Abradeço

von.juliano

São muitos os itens na collection associada?

Você pode não usar a collection associada ao objeto na view dando um “get” no objeto, você pode carregar os itens da coleção, digamos, de 20 em 20 e ir paginando.

Flw! :thumbup:

lelodois

brucsantos:
lelodois:
brucsantos:
wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

Entenda o problema…
http://blog.caelum.com.br/2009/10/13/enfrentando-a-lazyinitializationexception-no-hibernate/

Bom dia lelodois!

Acho que você não entendeu minha duvida… Eu sei qual é o problema e sei uma forma de resolver. E duvida é saber se existe outra forma ou se alguem fez de outra forma.

Abraços.

Se alguem tiver alguma ideia…

Abradeço

No seu controller, você pode copiar os valores de sua coleção para outra instância e coloca-la no seu jsp.

Pode usar
http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties%28java.lang.Object,%20java.lang.Object%29

abs

brucsantos

von.juliano:
São muitos os itens na collection associada?

Você pode não usar a collection associada ao objeto na view dando um “get” no objeto, você pode carregar os itens da coleção, digamos, de 20 em 20 e ir paginando.

Flw! :thumbup:

Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna…

No caso desse mesmo objeto em uma listagem, e nessa listagem você tivesse que mostrar esse atributo lista como você faria nesse caso para chamar o get de cada objeto? Iria fazer dois fors? um no Server e outro na pagina?

Obrigado pela força!

Abraços

brucsantos

lelodois:
brucsantos:
lelodois:
brucsantos:
wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

Entenda o problema…
http://blog.caelum.com.br/2009/10/13/enfrentando-a-lazyinitializationexception-no-hibernate/

Bom dia lelodois!

Acho que você não entendeu minha duvida… Eu sei qual é o problema e sei uma forma de resolver. E duvida é saber se existe outra forma ou se alguem fez de outra forma.

Abraços.

Se alguem tiver alguma ideia…

Abradeço

No seu controller, você pode copiar os valores de sua coleção para outra instância e coloca-la no seu jsp.

Pode usar
http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties%28java.lang.Object,%20java.lang.Object%29

abs

Este metodo que você me passou ele copia o objeto todo certo? eu teria que dar o get da minha lista antes de fazer essa copia? se sim iriamos cair no mesmo caso que comentei do von.juliano.

Abraçosss

lelodois

brucsantos:
lelodois:
brucsantos:
lelodois:
brucsantos:
wendelcavalcante:
Procura no google sobre o design pattern “Open Session In View”.
Basicamente, usando ele a sessão do hibernate será fechada apenas depois de renderizar a página e mandá-la pro cliente.

Bom dia wendelcavalcante!

Eu cheguei a fazer dessa forma o controle de transações. Só da pra fazer assim mesmo?

Abraços

Entenda o problema…
http://blog.caelum.com.br/2009/10/13/enfrentando-a-lazyinitializationexception-no-hibernate/

Bom dia lelodois!

Acho que você não entendeu minha duvida… Eu sei qual é o problema e sei uma forma de resolver. E duvida é saber se existe outra forma ou se alguem fez de outra forma.

Abraços.

Se alguem tiver alguma ideia…

Abradeço

No seu controller, você pode copiar os valores de sua coleção para outra instância e coloca-la no seu jsp.

Pode usar
http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties%28java.lang.Object,%20java.lang.Object%29

abs

Este metodo que você me passou ele copia o objeto todo certo? eu teria que dar o get da minha lista antes de fazer essa copia? se sim iriamos cair no mesmo caso que comentei do von.juliano.

Abraçosss

Sim, copia.
No seu bean vc pode criar um getListaInicializada()
E no get vc faz o for e retorna a copia.
O for da página é inevitável.

Abs

von.juliano

brucsantos:
Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna.

Pelas suas respostas, somando o que o lelodois disse, acho que só te sobra a opção do Open Session in View mesmo! :mrgreen:

Flw! :thumbup:

lelodois

von.juliano:
brucsantos:
Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna.

Pelas suas respostas, somando o que o lelodois disse, acho que só te sobra a opção do Open Session in View mesmo! :mrgreen:

Flw! :thumbup:

Concordo plenamente!
Bruno, porque vc não quer usar o openSession ?
Algum preconceito?
rsrs

brucsantos

lelodois:
von.juliano:
brucsantos:
Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna.

Pelas suas respostas, somando o que o lelodois disse, acho que só te sobra a opção do Open Session in View mesmo! :mrgreen:

Flw! :thumbup:

Concordo plenamente!
Bruno, porque vc não quer usar o openSession ?
Algum preconceito?
rsrs

Não que eu não queira não não sei se é certo misturar a parte de view com a parte de controle/serviço… Por isso queria saber uma forma mais bonita. Apenas isso.!

Abraços lelodois

lelodois

brucsantos:
lelodois:
von.juliano:
brucsantos:
Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna.

Pelas suas respostas, somando o que o lelodois disse, acho que só te sobra a opção do Open Session in View mesmo! :mrgreen:

Flw! :thumbup:

Concordo plenamente!
Bruno, porque vc não quer usar o openSession ?
Algum preconceito?
rsrs

Não que eu não queira não não sei se é certo misturar a parte de view com a parte de controle/serviço… Por isso queria saber uma forma mais bonita. Apenas isso.!

Abraços lelodois

Isto não é quebra de mvc…
A idéia de criar dto’s vo’s e o’s… para representação dos dados na camada web é conturbada, use somente se houver um caso específico.
Diferenete disto a sua entidade percorre do dao para a tela, não vejo problema nisso.

:wink:

brucsantos

lelodois:
brucsantos:
lelodois:
von.juliano:
brucsantos:
Neste caso é uma tela que exibe um objeto e uma lista que ele tem dentro de digamos uns 5 itens no maximo.
Não teria a necessidade de fazer a paginação… Já pensei em fazer isso também mais não acho muito bonito ficar cheio de get sem usar o objeto que ele retorna.

Pelas suas respostas, somando o que o lelodois disse, acho que só te sobra a opção do Open Session in View mesmo! :mrgreen:

Flw! :thumbup:

Concordo plenamente!
Bruno, porque vc não quer usar o openSession ?
Algum preconceito?
rsrs

Não que eu não queira não não sei se é certo misturar a parte de view com a parte de controle/serviço… Por isso queria saber uma forma mais bonita. Apenas isso.!

Abraços lelodois

Isto não é quebra de mvc…
A idéia de criar dto’s vo’s e o’s… para representação dos dados na camada web é conturbada, use somente se houver um caso específico.
Diferenete disto a sua entidade percorre do dao para a tela, não vejo problema nisso.

:wink:

Outro dia eu estava pesquisando sobre isso tinha uma discussão bem acirrada sobre isso. Bom nesse momento vou ter que fazer dessa forma mesmo pois não tenho muito tempo para pesquisar. Depois quando sobrar um tempinho vou fazer algumas pesquisas para ver se encontro novidades. Se obtiver sucesso posto aqui no guj para todos.

Fica aberto o post caso alguem tenha outra ideia que queira compartilhar com todos!

Obrigado pela ajuda lelodois e a todos do guj!

Abraços

Criado 29 de julho de 2010
Ultima resposta 30 de jul. de 2010
Respostas 14
Participantes 4