2012-03-15 9 views
9

Soy nuevo en hibernación.org.hibernate.HibernateException: get no es válida sin transacción activa

  • hibernate.cfg.xml creado automáticamente (asistente Netbeans)
  • creado automáticamente HibernateUtil.java
  • creado automáticamente clase POJO con anotaciones

tratando de conseguir objeto a partir de la base de datos, pero conseguir el error:

Exception in thread "pool-1-thread-1" org.hibernate.HibernateException: get is not valid without active transaction 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) 

obteniendo un objeto:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 

hibernate.cfg.xml

<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/sochi_feedback</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.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 
<property name="hibernate.current_session_context_class">thread</property> 
+0

¿Puede agregar el código que llama al método get()? –

+0

@ShashankKadne 'CallInfo ci = (CallInfo) session.get (CallInfo.class, ucid);' – VextoR

+1

Agregue "Transacción tx = session.beginTransaction();" justo antes de esta línea y al final de sus operaciones, llame a "tx.commit();" –

Respuesta

14

Añadir

Transaction tx = session.beginTransaction(); // Esta declaración se iniciará la transacción

justo antes de su CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid);

y al final de su transacción compromete los cambios llamando al ..

tx.commit(); 
+3

¿por qué la herramienta eclipse hibernate no genera automáticamente esto? –

3

Otra solución es utilizar openSession() en lugar de getCurrentSession(). Entonces, las transacciones se pueden usar solo cuando sea necesario para actualizar las consultas.

Session session = HibernateUtil.getSessionFactory().openSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 
+0

Estoy experimentando exactamente esto, es decir, que las sesiones obtenidas a través de getCurrentSession requieren una transacción incluso para operaciones get, mientras que esto no se aplica cuando se usa openSession. ¿Porqué es eso? (¿Había pensado que los objetos de sesión son idénticos?) –

+0

Tuve el mismo problema. ¿Pero por qué? –

0

Incluso después beginTransaction() yy commit() si usted todavía consigue el

Caused by: org.hibernate.HibernateException: setDefaultReadOnly is not valid without active transaction 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) 

vaya a "Inicio" y la búsqueda de los servicios y reinicie el servicio de base de datos

0

antes de empezar la transacción debe comenzar la sesión llamando al , inmediatamente después de crear sessionFactory.

Cuestiones relacionadas