Results 1 to 2 of 2

Thread: LazyInitializationException using OpenSessionInViewFilter

  1. #1
    Join Date
    Apr 2009
    Posts
    3

    Default LazyInitializationException using OpenSessionInViewFilter

    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

    Code:
    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
    web.xml

    Code:
    	<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>
    applicactionContext.xml

    Code:
    	<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>
    action-servlet.xml

    Code:
    	<bean name="/resultado" class="com.strutsHibernateSpring.action.ResultadoAction">
    		<property name="transactionManager" ref="myTxManager"/>
    		<property name="logica" ref="logica"/>
    	</bean>
    ResultadoAction.java


    Code:
    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");
    Logica.java

    Code:
    	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;
    		
    	}
    PersonaDaoHibernate.java

    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);
    	}
    }

  2. #2
    Join Date
    Apr 2009
    Posts
    3

    Default Problem solved

    I finally solved the problem (what a nightmare!).

    This thread helped me: http://forum.springsource.org/showth...t=35340&page=2

    A problem of duplication of contexts!!!!

    My application context was initialized twice. One by org.springframework.web.struts.ContextLoaderPlugIn and the other by org.springframework.web.context.ContextLoaderListe ner

    I solved the problem replacing (in struts-config.xml):

    Code:
    	<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    	  <set-property property="contextConfigLocation"
    	      value="/WEB-INF/action-servlet.xml,/WEB-INF/applicationContext.xml"/>
    	</plug-in>
    with

    Code:
    	<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •