2010-11-27 15 views
16

मैं हाइबरनेट और वसंत दोनों में एक नौसिखिया हूं। मैंने हाइबरनेट लेनदेन की सीमा के बारे में समझा है (कम से कम मुझे ऐसा लगता है)। लेकिन इस प्रकार की कुछ कोडिंग विधि के बाद:हाइबरनेट सत्र और लेनदेन प्रबंधन के साथ वसंत को एकीकृत कैसे करें?

sessionFactory.getCurrentSession().beginTransaction(); 
//do something here 
sessionFactory.getCurrentSession().endTransaction(); 

मैं इसे से बचना चाहते हैं करना शुरू कर दिया और यह अपने आप मेरी विधि ऐसी है कि मैं केवल "// यहाँ कुछ करना" भाग लिखने के बाहर किया करना चाहते हैं। मैंने TransactionProxyFactoryBean के बारे में पढ़ा है और लगता है कि एक्सएमएल कॉन्फ़िगरेशन बहुत लंबा है और प्रत्येक कक्षा के लिए दोहराया जाना है, जिसे मैं लेनदेन करना चाहता हूं, इसलिए यदि संभव हो तो मैं इसका उपयोग करना टालना चाहता हूं।

मैंने @ ट्रांसेक्शनल का उपयोग करने की कोशिश की लेकिन यह बिल्कुल काम नहीं करता है। मैं अपने applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
</bean> 

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

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

में इन पंक्तियों है और मैं पहले से ही @Transactional के साथ मेरी सेवा कक्षाओं में चिह्नित किया है लेकिन मैं हमेशा "xxx सक्रिय लेन-देन के बिना मान्य नहीं है" मिलता है। (Btw इकाई परीक्षण में चलने वाले) यहाँ एक उदाहरण कोड है कि मुझे एक त्रुटि दे रहा है:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = 
{ 
    "classpath:applicationContext.xml" 
}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
public class UserServiceTest 
{ 
    @Resource 
    private UserService userService; 

    @Test 
    public void testAddUser() 
    { 
     User us = new User(); 
     us.setName("any name"); 
     userService.addUser(us); 
    } 
} 

इस मामले में, सटीक त्रुटि संदेश है: "org.hibernate.HibernateException: बचाने के सक्रिय लेन-देन के बिना मान्य नहीं है "।

अद्यतन: मैंने बाहरी यूनिट परीक्षणों (यानी वास्तविक वेब एप्लिकेशन से) से userService.addUser() विधि को कॉल करने का प्रयास किया और मुझे भी वही त्रुटि मिली।

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 
     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

     <!-- all my mapping resources here --> 
    </session-factory> 
</hibernate-configuration> 

userService वर्ग @Transactional के साथ चिह्नित है:

यह मेरा hibernate.cfg.xml है। मैं हाइबरनेट 3.3.2 और वसंत 2.5.6 का उपयोग कर रहा हूं।

क्या मुझे यह ठीक करने के बारे में कुछ सलाह हो सकती है?

+0

अपना 'hibernate.cfg.xml' दिखाएं। – axtavt

उत्तर

15

निम्न पंक्ति निकालें, यह वसंत से प्रबंधित लेनदेन के साथ हस्तक्षेप:

<property name="current_session_context_class">thread</property> 
+0

यह अच्छी तरह से काम कर रहा है, मदद के लिए धन्यवाद। – Hery

+1

मुझे एक ही समस्या थी। लेकिन जब मैंने इस पंक्ति को हटा दिया तो निम्न त्रुटि प्राप्त हो रही है। हाइबरनेट अपवाद: कोई CurrentSessionContext कॉन्फ़िगर नहीं किया गया है! \t org.hibernate.impl.SessionFactoryImpl.getCurrentSession (सत्र FactoryImpl.java:685) –

+0

हैलो, इस लाइन को हटाने में मदद क्यों करती है? मुझे यह नहीं मिला, मुझे एक ही समस्या है, और मूल्य को बदलने की कोशिश करने से कोई भी मदद नहीं करता है। यदि यह पंक्ति हटा दी जाती है तो डिफ़ॉल्ट मान क्या है? क्या कोई जानता है? – hephestos

1

@hephestos: पैरामीटर current_session_context_class के लिए मूल्य संदर्भ में जो करने के लिए सत्र (हाइबरनेट सत्र) के साथ बाध्य किया जाना चाहिए का फैसला किया।

डिफ़ॉल्ट रूप से यह वर्तमान में चल रहे थ्रेड के साथ बाध्य है। लेकिन जब लेनदेन को प्रबंधित करने के लिए "jta" का उपयोग किया जाता है, तो इस पैरामीटर के मान को "jta" में बदलना वर्तमान जेटीए लेनदेन संदर्भ में सत्र को बांधता है।

असल में यह सत्रों के संदर्भ को परिभाषित करता है। अधिक जानकारी: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session

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