2012-08-17 10 views
8

Sto creando l'applicazione JSF e uso alcune cose di ibernazione. Tutto quello che voglio fare è quello di salvare l'entità nel database, ma continuo a ricevere questa eccezione:org.hibernate.HibernateException: il salvataggio non è valido senza la transazione attiva

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

In un primo momento mi è stato sempre questa eccezione:

org.hibernate.HibernateException: No CurrentSessionContext configured! 

poi ho scoperto che ho bisogno di aggiungere questo nella mia configurazione hibernate:

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

Ciò ha risolto questo problema, ma ora sembra quello superiore. Mi risparmio entità nel database come questo:

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

Il mio file hibernate.cfg.xml si presenta così:

<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> 

sto usando:

  • Hibernate-4.1.4 .Final
  • JDK 1.6
  • Tomcat 6
  • JSF 2.0
  • primefaces 3.3.1
  • MySql

Qualcuno sa dove potrebbe essere il problema?

risposta

20

devi chiamare

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

Grazie, ha funzionato. –

+0

Sto utilizzando Spring HibernateTransactionManager tramite Spring AOP per configurare le transazioni. Riesco a vedere nei registri che la transazione sta avviando correttamente, ma il mio salvataggio non riesce ancora perché non sto utilizzando il codice precedente. Perché? –

3

provare a cambiare il metodo di essere la seguente:

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

dovrebbe risolvere il problema.

3

fare in questo modo:

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

fare la movimentazione parte da soli eccezione.

2

penso che troverete qualcosa di simile a questo è più robusto e appropriata:

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(); 
} 

Non è possibile "chiudere" la transazione, è possibile chiudere la sessione, come si può vedere. Leggi this here, potrebbe essere utile per te.

+0

Attenzione, "openSession" dovrebbe essere evitato. Il metodo corretto è "getCurrentSession". –

Problemi correlati