2012-08-17 72 views
8

Estoy creando la aplicación JSF y estoy usando algunas cosas de hibernación. Todo lo que quiero hacer es salvar a la entidad en la base de datos, pero me siguen dando esta excepción:org.hibernate.HibernateException: guardar no es válido sin la transacción activa

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

Al principio me estaba poniendo esta excepción:

org.hibernate.HibernateException: No CurrentSessionContext configured! 

Entonces me encontré con que tengo que añadir esto en mi configuración de hibernación:

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

Esto resolvió este problema pero ahora aparece el anterior. estoy ahorrando entidad en base de datos de esta manera:

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

Mi archivo hibernate.cfg.xml se ve así:

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

estoy usando:

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

¿Alguien sabe donde podría ser el problema?

Respuesta

20

usted tiene que llamar

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

Gracias, eso funcionó. –

+0

Estoy usando Spring HibernateTransactionManager a través de Spring AOP para configurar las transacciones. Puedo ver en los registros que la transacción se inicia correctamente, pero mi salvación sigue fallando porque no estoy usando el código anterior. ¿Porqué es eso? –

3

trate de cambiar su método de ser de la siguiente manera:

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

debería resolver su problema.

3

hacerlo de esta manera:

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

¿Tienen el mismo manipulación de la pieza excepción.

2

creo que encontrará algo como esto es más robusto y adecuado:

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

No se puede "cerrar" la transacción, puede cerrar la sesión, como se puede ver. Lea this here, podría ser útil para usted.

+0

Se debe evitar el cuidado, "openSession". El método correcto es "getCurrentSession". –

Cuestiones relacionadas