2009-01-13 11 views
8

मुझे LazyInitializationException के साथ कोई समस्या है भले ही मैं openSessionInViewInterceptor का उपयोग कर रहा हूं। मैंने उस विषय के बारे में इतनी सारी पोस्ट पढ़ी हैं और मैंने इसके लिए तीन या चार अलग-अलग दृष्टिकोणों की कोशिश की है।LazyInitializationException हालांकि OpenSessionInViewInterceptor

पहली बात यह है कि मैं हाइबरनेट कॉन्फ़िगरेशन फ़ाइल में आलसी विशेषता को झूठा सेट नहीं करना चाहता हूं। तो, मैं उस समस्या का वास्तविक समाधान चाहता हूं। मैं स्प्रिंग 2.5, हाइबरनेट 3, नेटबीन्स और टोमकैट का उपयोग कर रहा हूं।

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

मुझे लगता है कि ये महत्वपूर्ण फाइलें हैं। मैं चीजों की बहुत सारी की कोशिश की है और मैं हमेशा LazyInitializationException या

org.hibernate.HibernateException हो रही है: नहीं हाइबरनेट सत्र थ्रेड के लिए बाध्य है, और विन्यास गैर लेन-देन यहां के निर्माण की अनुमति नहीं है ...

मुझे नहीं पता कि कौन सा सबसे खराब है।

अग्रिम धन्यवाद!

+0

इंडेक्स नियंत्रक के लिए बीन परिभाषा और स्रोत को देखने में मददगार हो सकता है – skaffman

उत्तर

1

मुझे लगता है कि आप web.xml स्तर पर फ़िल्टर की जरूरत है:

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

केवल इस तरह से पता करने के लिए जब आपके विचार प्रदान की जा रही है में सक्षम हो वसंत जाएगा।

+0

इंटरसेप्टर को फिल्टर के समान प्रभाव होना चाहिए, यह मानते हुए कि नियंत्रक दृश्य को अग्रेषित कर रहा है। – skaffman

+0

मेरा मानना ​​है कि कुछ वसंत संस्करण में इंटरसेप्टर के साथ एक बग था, इसलिए फ़िल्टर को प्राथमिकता दी गई थी। यकीन नहीं है, यद्यपि। –

0

तुम मेरे

<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

और यह समस्या को कैसे ठीक करेगा? – skaffman

0

में एक बार देख ले अपने सत्र पूरे अनुरोध के दौरान खुला रखने के लिए वसंत से एक इंटरसेप्टर देशी उपयोग करने का प्रयास कर सकते हैं, तो आप अपने web.xml को वसंत के OpenSessionInViewFilter जोड़ने की आवश्यकता होगी। यह एक hibernate3 के लिए विशिष्ट है:

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

समस्या लेनदेन प्रबंधक के आपके उपयोग है: यह एक नया सत्र शुरू होगा और के बाद से आप मैन्युअल रूप से इसे खोला है, यह भी उसे बंद करेंगे। आपको स्प्रिंग कॉन्फ़िगरेशन का उपयोग करके अपने लेनदेन प्रबंधन को कॉन्फ़िगर करने की आवश्यकता है, इसलिए सभी घटक सही तरीके से काम करेंगे।

अपनी व्यावसायिक परत (TasqueService) पर एक लेनदेन इंटरसेप्टर का उपयोग करें।