2011-09-20 16 views
5

का उपयोग कर लेनदेन प्राप्त करने में सफलतापूर्वक अपवाद शुरू नहीं हुआ है मेरे पास एक उपयोगकर्ता प्रोफाइल इकाई है जिसे मुझे सहेजने की आवश्यकता है। इसके अलावा जब मैं तालिका देखें इकाई के बजाय एक रोलबैक करने का एक समान होती हैस्प्रिंग हाइबरनेट

Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 

: डेटाबेस में इकाई बचाने के बाद, मैं निम्न अपवाद प्राप्त करें!

@Transactional(isolation=Isolation.REPEATABLE_READ) 
public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.getTransaction().commit(); 
     session.close(); 
     return userProfile; 
    } 
} 

मैं हाइबरनेट लेनदेन प्रबंधक

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

उपयोग कर रहा हूँ और मेरी हाइबरनेट config है:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="com.springheatmvn.domain"/> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.connection.pool_size">10</prop> 
      <prop key="hibernate.connection.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property>  
</bean> 

किसी pl कर सकते हैं। मुझे बताओ कि यहाँ क्या हो रहा है?

+0

'@ user354161' 'बोझो' – Bitmap

उत्तर

10

मुझे लगता है कि आप दोहरी लेनदेन प्रबंधन का शिकार हो गए हैं। यदि आप एक ही प्रोजेक्ट में Spring Transaction Management और Hibernate Transaction Management का उपयोग कर रहे हैं, तो आपको इस समस्या का अधिक संभावना है।

आपका कोड तो चाहिए या तो:

विकल्प 1.हाइबरनेट लेनदेन प्रबंधन

public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.getTransaction().commit(); 
     session.close(); 
     return userProfile; 
    } 
} 

या विकल्प 2.वसंत लेनदेन प्रबंधन

@Transactional 
public class HibernateUserProfileDAO implements UserProfileDAO { 
    private org.hibernate.SessionFactory sessionFactory; 
    public UserProfile getUserProfile(int userId) { 
     org.hibernate.classic.Session session = sessionFactory.getCurrentSession(); 
     UserProfile userProfile = new UserProfile(); 
     userProfile.setUserName("sury1"); 
     session.save(userProfile); 
     session.close(); 
     return userProfile; 
    } 
} 
+1

युप से संपादित उत्तर और टिप्पणी देखें, या तो @ ट्रान्सैक्शनल या .beginTransactional() का उपयोग करें। इसके अलावा - वसंत लेनदेन अलगाव स्तर – Bozho

+0

बदलने का समर्थन नहीं करते हैं वसंत लेनदेन अलगाव स्तर में परिवर्तन का समर्थन करते हैं, लेकिन केवल 'डेटासोर्सट्रांसक्शन प्रबंधक' में। एक रैपर वर्ग भी है, 'org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter' आप हाइबरनेट टीएक्स प्रबंधक में उपयोग कर सकते हैं। लेकिन, यदि आपको अलग-अलग स्थानों में अलग-अलग अलगाव स्तर की आवश्यकता है, तो आपको अलग-अलग हाइबरनेट TX प्रबंधकों को प्रबंधित करना होगा, जिन्हें एओपी के साथ किया जा सकता है लेकिन '@ लेनदेन 'एनोटेशन के साथ नहीं किया जा सकता है। – AngerClown

+0

धन्यवाद दोस्तों !, यह मेरे लिए अब काम किया !!! मैंने @ बिटमैप द्वारा सुझाए गए विकल्प 2 का उपयोग किया। विकल्प 2 में बस एक सुधार, हमें सत्र.क्लोज़() कथन को sessionFactory.getCurrentSession() सत्र को स्वचालित रूप से बंद कर देता है। जब मेरे पास session.close() कथन था, मुझे org.hibernate मिला। सत्र अपवाद: सत्र बंद है! अपवाद। एक बार फिर धन्यवाद! – tintin

0

org.springframework.orm.hibernate3.HibernateTemplate और org.hibernate.Session के बीच एक संघर्ष भी हो सकता है।

यदि आप किसी पुराने प्रोजेक्ट पर काम कर रहे हैं तो आप HibernateTemplate का उपयोग कर सकते हैं।

यदि आप चीजों को करने के नए तरीके के साथ एक नया डीएओ बनाते हैं, जैसे हाइबरनेट के Session, और उसी फ़ंक्शन पर डीएओ दोनों का उपयोग करें, तो आपको यह त्रुटि मिल जाएगी।

समाधान: एक या दूसरे का उपयोग करें। मेरे मामले में मुझे सभी पुराने कार्यक्रमों को बदलने के क्रम में HibernateTemplate का उपयोग करना पड़ा।

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