PDA

View Full Version : lazily initialize a collection -- no session or session was closed



negnoire
Nov 2nd, 2005, 10:58 AM
I was experiencing the following problem:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection (com.deg.helix.provision.account.Account.serviceIn stances) - no session or session was closed
at org.hibernate.collection.AbstractPersistentCollect ion.initialize(AbstractPersistentCollection.java:1 80)
at org.hibernate.collection.AbstractPersistentCollect ion.read(AbstractPersistentCollection.java:48)
at org.hibernate.collection.PersistentSet.size(Persis tentSet.java:110)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.formatServiceInstances(AccountDetailUtil.ja va:373)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.loadTemplateContext(AccountDetailUtil.java: 203)
at com.deg.helix.cpanel.webapp.mvc.form.accountdetail .AccountDetailFormController.getReferenceData(Acco untDetailFormController.java:99)
at com.deg.helix.cpanel.webapp.mvc.controller.SimpleF ormTemplateController.getInternalReferenceData(Sim pleFormTemplateController.java:34)
at com.deg.helix.util.webapp.mvc.SimpleFormController .referenceData(SimpleFormController.java:76)
at com.deg.helix.util.webapp.mvc.SimpleFormController .showForm(SimpleFormController.java:63)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.showNewForm(AbstractFormController.java:3 06)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.handleRequestInternal(AbstractFormControl ler.java:248)
at org.springframework.web.servlet.mvc.AbstractContro ller.handleRequest(AbstractController.java:128)
at org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter.handle(SimpleControllerHandlerAda pter.java:44)
at org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:675)
2005-11-01 16:55:25,973 ERROR [org.springframework.web.servlet.DispatcherServlet] Could not complete request
org.hibernate.LazyInitializationException: failed to lazily initialize a collection (com.deg.helix.provision.account.Account.serviceIn stances) - no session or session was closed
at org.hibernate.collection.AbstractPersistentCollect ion.initialize(AbstractPersistentCollection.java:1 80)
at org.hibernate.collection.AbstractPersistentCollect ion.read(AbstractPersistentCollection.java:48)
at org.hibernate.collection.PersistentSet.size(Persis tentSet.java:110)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.formatServiceInstances(AccountDetailUtil.ja va:373)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.loadTemplateContext(AccountDetailUtil.java: 203)
at com.deg.helix.cpanel.webapp.mvc.form.accountdetail .AccountDetailFormController.getReferenceData(Acco untDetailFormController.java:99)
at com.deg.helix.cpanel.webapp.mvc.controller.SimpleF ormTemplateController.getInternalReferenceData(Sim pleFormTemplateController.java:34)
at com.deg.helix.util.webapp.mvc.SimpleFormController .referenceData(SimpleFormController.java:76)
at com.deg.helix.util.webapp.mvc.SimpleFormController .showForm(SimpleFormController.java:63)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.showNewForm(AbstractFormController.java:3 06)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.handleRequestInternal(AbstractFormControl ler.java:248)
at org.springframework.web.servlet.mvc.AbstractContro ller.handleRequest(AbstractController.java:128)
at org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter.handle(SimpleControllerHandlerAda pter.java:44)
at org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:675)
2005-11-01 16:55:26,026 ERROR [com.deg.helix.webapp.mvc.security.HelixSecurityEnf orcementFilter] org.hibernate.LazyInitializationException: failed to lazily initialize a collection (com.deg.helix.provision.account.Account.serviceIn stances) - no session or session was closed
at org.hibernate.collection.AbstractPersistentCollect ion.initialize(AbstractPersistentCollection.java:1 80)
at org.hibernate.collection.AbstractPersistentCollect ion.read(AbstractPersistentCollection.java:48)
at org.hibernate.collection.PersistentSet.size(Persis tentSet.java:110)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.formatServiceInstances(AccountDetailUtil.ja va:373)
at com.deg.helix.webapp.mvc.accountdetail.AccountDeta ilUtil.loadTemplateContext(AccountDetailUtil.java: 203)
at com.deg.helix.cpanel.webapp.mvc.form.accountdetail .AccountDetailFormController.getReferenceData(Acco untDetailFormController.java:99)
at com.deg.helix.cpanel.webapp.mvc.controller.SimpleF ormTemplateController.getInternalReferenceData(Sim pleFormTemplateController.java:34)
at com.deg.helix.util.webapp.mvc.SimpleFormController .referenceData(SimpleFormController.java:76)
at com.deg.helix.util.webapp.mvc.SimpleFormController .showForm(SimpleFormController.java:63)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.showNewForm(AbstractFormController.java:3 06)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.handleRequestInternal(AbstractFormControl ler.java:248)
at org.springframework.web.servlet.mvc.AbstractContro ller.handleRequest(AbstractController.java:128)
at org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter.handle(SimpleControllerHandlerAda pter.java:44)
at org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:675)


I looked at several postings dealing with this matter and I was directed to use an OpenSessionInViewFilter after setting up this filter, I kept on getting the same error. After further investigating the problem I noticed that even after adding the filter multiple sessions were being opened and closed. And the above exception was being thrown with the filter. So I decided to look at the way my applicationContext was configured and it looked like this.

<!-- Helix Hibernate Entity Classes -->
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFac toryBean">
<property name="mappingResources">
<list>
<value>com/blah/blah/Account.hbm.xml</value>

</list>
</property>
</bean>

<bean id="myTransactionManager" name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransa ctionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="accountTarget" class="com..AccountDaoImpl">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>

<bean id="account" class="org.springframework.transaction.interceptor.Transa ctionProxyFactoryBean">
<property name="transactionManager"><ref bean="myTransactionManager"/></property>
<property name="target"><ref local="accountTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="save">PROPAGATION_REQUIRED</prop>
<prop key="make">PROPAGATION_REQUIRED</prop>
<prop key="delete">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
<property name="preInterceptors">
<list>
<ref bean="methodMeterInterceptor"/>
</list>
</property>
</bean>

in the AccountDaoImpl class I am extending HibernateDaoSupport which creates new instance of HibernateTemplate for each Dao. In an attempt to avoid creating a new HibernateTemplate For each Dao, I did the following:

<bean id="myHibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTempla te">
<constructor-arg><ref bean="mySessionFactory"/></constructor-arg>
</bean>

<bean id="accountTarget" class="com....AccountDaoImpl">
<property name="hibernateTemplate">
<ref bean="myHibernateTemplate"/>
</property>
</bean>

<bean id="account" class="org.springframework.transaction.interceptor.Transa ctionProxyFactoryBean">
<property name="transactionManager"><ref bean="myTransactionManager"/></property>
<property name="target"><ref local="accountTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="save">PROPAGATION_REQUIRED</prop>
<prop key="make">PROPAGATION_REQUIRED</prop>
<prop key="delete">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
<property name="preInterceptors">
<list>
<ref bean="methodMeterInterceptor"/>
</list>
</property>
</bean>

After making the above changes every thing seems to work correctly. I no longer get the "lazily initialize a collection -- no session or session was closed" anymore.

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++
Now, my question. Is there an advantage to setting the hibernateTemplate directly or passing the sessionFactory to the hibernateDaoSupport and have the hibernateDaoSupport create a new Instance of the HibernateTemplate?

Thanks in advance