2013-09-16 5 views
18

मैं हाइबरनेट 4 और स्प्रिंग लेन-देन का उपयोग करता है एक वसंत 3.2 आवेदन किया है। सभी विधियां बहुत अच्छी तरह से काम कर रही थीं और मैं इकाइयों को सहेजने या पुनर्प्राप्त करने के लिए डेटाबेस को सही ढंग से एक्सेस कर सकता था। फिर, मैं कुछ बहु सूत्रण शुरू की, और के बाद से प्रत्येक थ्रेड db से मैं हाइबरनेट से निम्न त्रुटि हो रही थी ऐक्सेस कर रहे थे:वसंत लेनदेन और hibernate.current_session_context_class

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions 

मैं वेब कि मैं अपने हाइबरनेट विन्यास को <prop key="hibernate.current_session_context_class">thread</prop> जोड़ने के लिए है से पढ़ते हैं, लेकिन अब हर बार जब मैं db मैं तक पहुँचने का प्रयास:

org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction 

हालांकि मेरी सेवा तरीकों @Transactional से एनोटेट, और सभी <prop key="hibernate.current_session_context_class">thread</prop> के ऐड से पहले ठीक काम कर रहा था।

क्यों कोई लेन-देन नहीं है, हालांकि तरीकों @Transactional साथ एनोटेट कर रहे हैं? इस समस्या का समाधान किस प्रकार से किया जा सकता है?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

<!-- Hibernate session factory --> 
<bean 
    id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > 
    <property name="dataSource" > 
     <ref bean="dataSource" /> 
    </property> 
    <property name="hibernateProperties" > 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
      <prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.current_session_context_class">thread</prop> 
     </props> 
    </property> 
    <property name="annotatedClasses" > 
     <list> 
      ... 
     </list> 
    </property> 
</bean> 

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

<tx:annotation-driven transaction-manager="transactionManager"/> 

उत्तर

31

hibernate.current_session_context_class संपत्ति के साथ वसंत और वसंत में कामयाब लेनदेन का उपयोग करते समय कभी नहीं गंदगी के आसपास जब तक आप उपयोग कर रहे हैं:

यहाँ मेरी हाइबरनेट विन्यास (सत्र संदर्भ संपत्ति सहित) है JTA।

वसंत डिफ़ॉल्ट रूप से अपने CurrentSessionContext कार्यान्वयन (SpringSessionContext) सेट करेगा, हालांकि यदि आप इसे स्वयं सेट करते हैं तो यह मामला नहीं होगा। मूल रूप से उचित लेनदेन एकीकरण तोड़ना।

इस सेटिंग को बदलने के लिए एकमात्र कारण जब भी आप JTA कामयाब लेनदेन का उपयोग करना चाहते हैं, तो आप सेटअप इस ठीक से JTA के साथ एकीकृत करने के लिए है है।

+0

ठीक है, मैं पुराने विन्यास बहाल है, लेकिन अब, मैं कैसे 'org.hibernate.HibernateException का समाधान कर सकते हैं: दो खुले sessions' कि बहु सूत्रण के साथ आता है के साथ एक संग्रह संबद्ध करने के लिए अवैध प्रयास? असल में मुझे धागे हैं, और वे दोनों एक ही ऑब्जेक्ट पर 'सेव()' ऑपरेशन करने का प्रयास करते हैं, जिसमें संग्रह होता है। शायद मुझे इस स्थिति से बचना है और उनमें से केवल एक ही करना है? – user1781028

+1

आपके पास एक ही ऑब्जेक्ट क्यों है, जिसे एकाधिक थ्रेड द्वारा सहेजा जा रहा है। –

+0

ठीक है मैंने सहेजने वाले कार्यों में से एक को हटा दिया है। लेकिन क्या होगा, कुछ विशेष कारणों से, मुझे वास्तव में दोनों की आवश्यकता थी? – user1781028

संबंधित मुद्दे