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