2012-08-17 12 views
8

मैं JSF एप्लिकेशन बना रहा हूं और इसमें कुछ हाइबरनेट सामग्री का उपयोग कर रहा हूं। सभी मैं करना चाहता हूँ डेटाबेस में इकाई को बचाने के लिए है, लेकिन मैं इस अपवाद मिलती रहती है:org.hibernate.HibernateException: सहेजें सक्रिय लेनदेन के बिना मान्य नहीं है

org.hibernate.HibernateException: No CurrentSessionContext configured! 

तब मैंने पाया कि मैं जोड़ने की जरूरत: पहले मैं इस अपवाद हो रही थी पर

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

यह मेरे हाइबरनेट कॉन्फ़िगरेशन में:

<property name="hibernate.current_session_context_class">thread</property> 

इस समस्या को हल किया गया लेकिन अब उपर्युक्त दिखाई देता है। मैं इस तरह डेटाबेस में इकाई की बचत कर रहा हूँ:

public void create(T entity) { 
    getSessionFactory().getCurrentSession().save(entity); 
} 

मेरे hibernate.cfg.xml फ़ाइल इस तरह दिखता है:

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/online_tests_management</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">root</property> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.hbm2ddl.auto">update</property> 
     <property name="hibernate.current_session_context_class">thread</property> 

     <mapping class="com.groupgti.onlinetests.management.db.Service"/> 
    </session-factory> 
</hibernate-configuration> 

मैं उपयोग कर रहा हूँ:

  • हाइबरनेट-4.1.4 फाइनल
  • जेडीके 1.6
  • टॉमकैट 6
  • JSF 2.0
  • PrimeFaces 3.3.1
  • MySql

कोई जानता है, जहां समस्या हो सकती है?

public void create(T entity) { 
    getSessionFactory().getCurrentSession().beginTransaction(); 
    getSessionFactory().getCurrentSession().save(entity); 
    getSessionFactory().getCurrentSession().endTransaction(); 
} 

आपकी समस्या का समाधान करना चाहिए:

उत्तर

20

आप कॉल करने के लिए

public void create(T entity) { 
    Session session=getSessionFactory().getCurrentSession(); 
    Transaction trans=session.beginTransaction(); 
    session.save(entity); 
    trans.commit(); 
} 
+0

धन्यवाद, यह काम किया। –

+0

मैं वसंत एओपी के माध्यम से लेनदेन को कॉन्फ़िगर करने के लिए वसंत HibernateTransactionManager का उपयोग कर रहा हूँ। मैं लॉग में देख सकता हूं कि लेनदेन ठीक से शुरू हो रहा है लेकिन मेरी बचत अभी भी विफल रही है क्योंकि मैं उपरोक्त कोड का उपयोग नहीं कर रहा हूं। ऐसा क्यों है? –

3

अपने विधि बदलते इस प्रकार की कोशिश करो की है।

3

इसे इस तरह कार्य करें:

public void create(T entity) { 
     org.hibernate.Session ss= getSessionFactory().getCurrentSession(); 
     Transaction tx=ss.beginTransaction(); 
     ss.save(entity); 
     tx.commit();  
    } 

अपवाद भाग से निपटने स्वयं करें।

2

मुझे लगता है कि इस तरह और अधिक मजबूत और उचित है कि आप कुछ मिल जाएगा:

Session session = factory.openSession(); 
Transaction tx = null; 
try { 
    tx = session.beginTransaction(); 

    // Do some work like: 
    //session.load(...); 
    //session.persist(...); 
    //session.save(...); 

    tx.commit(); // Flush happens automatically 
} 
catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; // or display error message 
} 
finally { 
    session.close(); 
} 

आप नहीं "बंद" लेन-देन, आप सत्र बंद कर सकते हैं कर सकते हैं, जैसा कि आप देख सकते हैं। this here पढ़ें, यह आपके लिए उपयोगी हो सकता है।

+0

देखभाल, "ओपन सत्र" से बचा जाना चाहिए। उचित विधि "getCurrentSession" है। –

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