2009-01-13 8 views
8

Ich habe ein Problem mit LazyInitializationException, obwohl ich openSessionInViewInterceptor verwenden. Ich habe so viele Beiträge zu diesem Thema gelesen und habe drei oder vier verschiedene Ansätze dafür ausprobiert.LazyInitializationException obwohl openSessionInViewInterceptor

Als erstes möchte ich das Attribut lazzy in der Hibernate-Konfigurationsdatei nicht auf false setzen. Also, ich möchte eine tatsächliche Lösung für dieses Problem. Ich benutze Spring 2.5, Hibernate 3, Netbeans und Tomcat.

Meine Implementierung ist wie folgt:

servlet.xml

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="interceptors"> 
      <list> 
       <ref bean="openSessionInViewInterceptor" /> 
      </list> 
     </property> 
     <property name="mappings"> 
      <props> 
       <prop key="/index.htm">indexController</prop> 
      </props> 
     </property> 
</bean> 
<bean id ="openSessionInViewInterceptor" name="openSessionInViewInterceptor" 
    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
</bean> 

applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource"> 
      <ref local="dataSource"/> 
     </property> 
     <property name="mappingResources"> 
      <list> 
       <value>TasquesDAOHibernate/Model/Tasca.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/TipusTasca.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/Prioritat.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/Persona.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/EstatTasca.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/Usuari.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/LogActivitat.hbm.xml</value> 
       <value>TasquesDAOHibernate/Model/ObjecteSIPANUsuari.hbm.xml</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.jdbc.batch_size">0</prop> 
      </props> 
     </property> 
    </bean> 


    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory"/> 
     </property> 
    </bean> 

    <bean id="tasquesDAO" class="TasquesDAOHibernate.TasquesDAOHibernate"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory"/> 
     </property> 
    </bean> 

<bean id="tasquesService" name="tasquesService" class="Tasques_www.service.TasquesService" > 
     <property name="tasquesDAO"> 
      <ref local="tasquesDAO"/> 
     </property> 
     <property name="transactionManager" ref="transactionManager"/> 
    </bean> 

TasquesService.java

public List<Tasca> getTasques() { 
     List<Tasca> tasques = (List)this.transactionTemplate.execute(new   TransactionCallback() { 

      public Object doInTransaction(TransactionStatus status) { 
       Object tasques = tasquesDAO.getTasques(); 
       return tasques; 
      } 
     }); 
     return tasques; 
    } 

TasquesDAOHibernate.ja va

public List<Tasca> getTasques() { 
     Session session = this.sessionFactory.getCurrentSession(); 
     try{ 
      Query query = session.createQuery("SELECT element FROM Tasca AS element"); 
      List result = query.list(); 
      return result; 
     }catch(HibernateException ex){ 
      return null; 
     } 
    } 

Ich denke, das sind die wichtigen Dateien. Ich habe viele Dinge ausprobiert und ich bin immer LazyInitializationException oder

org.hibernate.HibernateException bekommen: Nein Hibernate Session einzufädeln gebunden und Konfiguration erlaubt keine Erstellung von nicht-transaktionale hier ...

Ich weiß nicht, welches am schlechtesten ist.

Vielen Dank im Voraus!

+0

Es ist hilfreich, die Bean-Definition und die Quelle für indexController auch zu sehen – skaffman

Antwort

1

Ich glaube, Sie brauchen einen Filter am web.xml Ebene:

<filter> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 

Nur diese Weise in der Lage sein wird, Frühjahr zu wissen, wann Ihre Ansicht gerendert wird.

+0

Der Interceptor sollte die gleiche Wirkung wie der Filter haben, vorausgesetzt, dass der Controller die Ansicht weiterleitet. – skaffman

+0

Ich glaube, es gab einen Bug in einigen Frühlings-Version mit dem Interzeptor, so dass der Filter bevorzugt wurde. Nicht sicher, obwohl. –

0

Sie können versuchen, mein

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
</bean> 

<bean id="txAttributeSource" 
    class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> 
    <property name="properties"> 
     <props> <!-- this catches every method with the interceptor--> 
      <prop key="*">PROPAGATION_REQUIRED</prop> 
     </props> 
    </property> 
</bean> 

<bean id="txInterceptor" 
    class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
    <property name="transactionManager"> 
     <ref local="transactionManager" /> 
    </property> 
    <property name="transactionAttributeSource"> 
     <ref local="txAttributeSource" /> 
    </property> 
</bean> 

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="interceptorNames"> 
     <list> 
      <idref local="txInterceptor" /> 
     </list> 
    </property> 
    <property name="beanNames"> 
     <list> <!--this proxies every bean with the especified pattern --> 
      <value>*BL</value> 
     </list> 
    </property> 
</bean> 
+0

Und wie würde das das Problem beheben? – skaffman

0

Um Ihre Sitzung geöffnet während der gesamten Anfrage, werden Sie hinzufügen müssen Spring OpenSessionInViewFilter zu Ihrem web.xml ein Abfangjäger nativer aus Spring einen Blick mit in. Dies ist spezifisch für Hibernate3:

<filter> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
</filter> 
1

Das Problem ist die Nutzung des Transaktionsmanagers: Dies wird eine neue Sitzung starten und da Sie es manuell geöffnet, wird es auch schließen. Sie müssen Ihre Transaktionsverwaltung mithilfe der Springs-Konfiguration konfigurieren, damit alle Komponenten ordnungsgemäß zusammenarbeiten.

Verwenden Sie einen Transaktionsabfanger auf Ihrer Business-Schicht (TasqueService).