2010-11-27 12 views
16

Soy un principiante tanto en hibernación como en primavera. He entendido sobre la demarcación de transacción de hibernación (al menos eso creo). Pero después de codificar unos cuantos método como este:¿Cómo integrar la primavera con la sesión de hibernación y la gestión de transacciones?

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

empecé a querer evitarlo y quieren tener que hacer automáticamente fuera de mi método de este tipo que yo sólo escribo la parte "// hacer 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.

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

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

y ya he marcado mis clases de servicio con @Transactional pero siempre me sale el "xxx no es válida sin transacción activa". Aquí es un ejemplo de código que me dan un error (pista de prueba de unidad 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: salvar no es válida sin transacción activa ".

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

Esta es mi hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 
     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

     <!-- all my mapping resources here --> 
    </session-factory> 
</hibernate-configuration> 

La clase UserService está marcado con @Transactional. Estoy usando hibernate 3.3.2 y Spring 2.5.6.

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

+0

Muestre su 'hibernate.cfg.xml'. – axtavt

Respuesta

15

Retire la siguiente línea, que interfiere con las operaciones gestionadas-primavera:

<property name="current_session_context_class">thread</property> 
+0

esto está funcionando bien, gracias por la ayuda. – Hery

+1

Tuve un problema similar. pero obteniendo el siguiente error cuando eliminé esta línea. HibernateException: ¡No se configuró CurrentSessionContext! \t org.hibernate.impl.SessionFactoryImpl.getCurrentSession (SessionFactoryImpl.java:685) –

+0

Hola, ¿POR QUÉ es útil eliminar esta línea? No lo entiendo, tengo un problema similar, y tratar de reemplazar el valor tampoco ayuda. ¿Cuál es el valor predeterminado entonces si esta línea se elimina? ¿Alguien sabe? – hephestos

1

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

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 para las sesiones. Más información: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session

Cuestiones relacionadas