Hi everyone.
Iīve spent various days trying to resolve this problem but I canīt find a solution in the forum. I hope you can help me.
Application with Struts 1.3.9 - Hibernate 3.2.6 - Spring 2.5.6 running on Tomcat 5.5.26
Iīd like to implement an open session in view pattern using OpenSessionInViewFilter. The problem is a LazyInitializationException I canīt understand. Iīve learned that OpenSessionInViewFilter creates an Hibernate session and binds it to the Thread. This way, classes like HibernateTemplate and HibernateTransactionManager doesnīt have to worry about creating, flushing and closing Hibernate sessions.
However, it looks like HibernateTransactionManager is creating and closing a second Hibernate session. Closing this second Hibernate session is the cause of the LazyInitializationException later, in the view.
Do I have a configuration error?
How can I avoid the creation of the second Hibernate session?
Thanks a lot and sorry if my english is not perfect ;-)
log
web.xmlCode:DEBUG OpenSessionInViewFilter:239 - Using SessionFactory 'mySessionFactory' for OpenSessionInViewFilter DEBUG DefaultListableBeanFactory:214 - Returning cached instance of singleton bean 'mySessionFactory' DEBUG OpenSessionInViewFilter:181 - Opening single Hibernate Session in OpenSessionInViewFilter DEBUG SessionFactoryUtils:318 - Opening Hibernate Session DEBUG TransactionSynchronizationManager:186 - Bound value [org.springframework.orm.hibernate3.SessionHolder@2af8f5] for key [org.hibernate.impl.SessionFactoryImpl@1a4181c] to thread [http-8080-Processor24] DEBUG DelegatingActionUtils:166 - DelegatingActionProxy with mapping path '/resultado' and module prefix '' delegating to Spring bean with name [/resultado] DEBUG DefaultListableBeanFactory:214 - Returning cached instance of singleton bean '/resultado' DEBUG HibernateTransactionManager:371 - Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT DEBUG HibernateTransactionManager:496 - Opened new Session [org.hibernate.impl.SessionImpl@3eec1a] for Hibernate transaction DEBUG HibernateTransactionManager:507 - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@3eec1a] DEBUG HibernateTransactionManager:572 - Exposing Hibernate transaction as JDBC transaction [org.apache.commons.dbcp.PoolableConnection@1a1ff9] DEBUG TransactionSynchronizationManager:186 - Bound value [org.springframework.jdbc.datasource.ConnectionHolder@12943ac] for key [org.apache.commons.dbcp.BasicDataSource@cef6f1] to thread [http-8080-Processor24] DEBUG TransactionSynchronizationManager:186 - Bound value [org.springframework.orm.hibernate3.SessionHolder@19ed7e] for key [org.hibernate.impl.SessionFactoryImpl@1a8402c] to thread [http-8080-Processor24] DEBUG TransactionSynchronizationManager:261 - Initializing transaction synchronization DEBUG TransactionSynchronizationManager:142 - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@19ed7e] for key [org.hibernate.impl.SessionFactoryImpl@1a8402c] bound to thread [http-8080-Processor24] DEBUG TransactionSynchronizationManager:142 - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@19ed7e] for key [org.hibernate.impl.SessionFactoryImpl@1a8402c] bound to thread [http-8080-Processor24] DEBUG HibernateTemplate:410 - Found thread-bound Session for HibernateTemplate DEBUG HibernateTemplate:435 - Not closing pre-bound Hibernate Session after HibernateTemplate DEBUG HibernateTransactionManager:903 - Triggering beforeCommit synchronization DEBUG HibernateTransactionManager:916 - Triggering beforeCompletion synchronization DEBUG HibernateTransactionManager:730 - Initiating transaction commit DEBUG HibernateTransactionManager:651 - Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@3eec1a] DEBUG HibernateTransactionManager:929 - Triggering afterCommit synchronization DEBUG HibernateTransactionManager:945 - Triggering afterCompletion synchronization DEBUG TransactionSynchronizationManager:315 - Clearing transaction synchronization DEBUG TransactionSynchronizationManager:232 - Removed value [org.springframework.orm.hibernate3.SessionHolder@19ed7e] for key [org.hibernate.impl.SessionFactoryImpl@1a8402c] from thread [http-8080-Processor24] DEBUG TransactionSynchronizationManager:232 - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@12943ac] for key [org.apache.commons.dbcp.BasicDataSource@cef6f1] from thread [http-8080-Processor24] DEBUG HibernateTransactionManager:730 - Closing Hibernate Session [org.hibernate.impl.SessionImpl@3eec1a] after transaction DEBUG SessionFactoryUtils:789 - Closing Hibernate Session DEBUG TransactionSynchronizationManager:232 - Removed value [org.springframework.orm.hibernate3.SessionHolder@2af8f5] for key [org.hibernate.impl.SessionFactoryImpl@1a4181c] from thread [http-8080-Processor24] DEBUG OpenSessionInViewFilter:207 - Closing single Hibernate Session in OpenSessionInViewFilter DEBUG SessionFactoryUtils:789 - Closing Hibernate Session
applicactionContext.xmlCode:<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <filter> <filter-name>hibernateFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>mySessionFactory</param-value> </init-param> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <servlet-name>action</servlet-name> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
action-servlet.xmlCode:<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/prueba"/> <property name="username" value="prueba"/> <property name="password" value="prueba"/> </bean> <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/> <property name="mappingResources"> <list> <value>com/strutsHibernateSpring/modelo/Direccion.hbm.xml</value> <value>com/strutsHibernateSpring/modelo/Persona.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> <prop key="hibernate.show_sql">false</prop> </props> </property> </bean> <bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="personaDao" class="com.strutsHibernateSpring.dao.PersonaDaoHibernate"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="logica" class="com.strutsHibernateSpring.logica.Logica"> <property name="personaDao" ref="personaDao"/> </bean>
ResultadoAction.javaCode:<bean name="/resultado" class="com.strutsHibernateSpring.action.ResultadoAction"> <property name="transactionManager" ref="myTxManager"/> <property name="logica" ref="logica"/> </bean>
Logica.javaCode:transactionTemplate.execute(new TransactionCallbackWithoutResult() { public void doInTransactionWithoutResult(TransactionStatus status) { DynaActionForm inicioForm = (DynaActionForm) form; String nombre = inicioForm.getString("nombre"); String id = inicioForm.getString("id"); Collection<Persona> personas = logica.getPersona(id); request.setAttribute("nombre", nombre); request.setAttribute("personas", personas); } }); return mapping.findForward("listado");
PersonaDaoHibernate.javaCode:public Collection<Persona> getPersona(String id){ Collection<Persona> personas; if (id!=null && !id.equals("")){ personas = new ArrayList<Persona>(); int idInt = Integer.parseInt(id); Persona p = personaDao.getPersona(idInt); personas.add(p); }else{ personas = personaDao.getPersonas(); } return personas; }
Code:public class PersonaDaoHibernate extends HibernateDaoSupport implements PersonaDaoIntf{ public Persona getPersona(int id) throws DataAccessException { return (Persona)getHibernateTemplate().get(Persona.class, id); } public Collection<Persona> getPersonas() throws DataAccessException { return getHibernateTemplate().loadAll(Persona.class); } }


Reply With Quote
