¿Cómo integrar la spring con la sesión de hibernación y la gestión de transacciones?

Soy un principiante tanto en hibernación como en spring. He entendido sobre la demarcación de transacción de hibernación (al menos eso creo). Pero después de codificar algunos métodos como este:

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

Empecé a querer evitarlo y quiero hacerlo automáticamente fuera de mi método, de modo que solo escriba la parte “// haga algo aquí”. He leído sobre TransactionProxyFactoryBean y creo que la configuración xml es muy larga y debe repetirse para TODAS las clases que quiero que sean transaccionales, así que si es posible quiero evitar usarla.

Traté de usar el @Transactional pero no funciona en absoluto. Tengo estas líneas en mi applicationContext.xml

          

y ya he marcado mis clases de servicio con @Transactional pero siempre obtengo el mensaje “xxx no es válido sin transacción activa”. Aquí hay un código de ejemplo que me da un error (se ejecuta en la prueba unitaria por cierto):

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

En este caso, el mensaje de error exacto es: “org.hibernate.HibernateException: save no es válido sin transacción activa”.

ACTUALIZACIÓN : Intenté llamar al método userService.addUser () desde pruebas externas de la unidad (es decir, desde la aplicación web real) y obtuve el mismo error también.

Este es mi hibernate.cfg.xml:

      1  org.hibernate.dialect.MySQLDialect  thread  org.hibernate.cache.NoCacheProvider  true  update    

La clase userService está marcada con @Transactional. Estoy usando hibernate 3.3.2 y Spring 2.5.6.

¿Puedo obtener algunos consejos sobre cómo solucionar esto?

Elimine la siguiente línea e interfiere con las transacciones gestionadas por Spring:

 thread 

@hephestos: el valor para el parámetro current_session_context_class decide el contexto al que debe estar vinculada la sesión (sesión de Hibernate).

Por defecto está vinculado con el hilo que se está ejecutando actualmente. Pero cuando se usa “jta” para gestionar transacciones, al cambiar el valor de este parámetro a “jta” se vincula la sesión al contexto de transacción JTA actual.

Básicamente, define el contexto de las sesiones. Más información: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session