hibernate - sacar - que hago si mi computador dice hibernando
¿Cómo integrar Spring con la gestión de hibernación de sesiones y transacciones? (2)
Soy principiante tanto en hibernación como en primavera. He entendido sobre la demarcación de la 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();
Comencé a querer evitarlo y quiero que se haga 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 su uso.
Intenté usar el @Transactional pero no funciona en absoluto. Tengo estas lineas en mi aplicacionContext.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 obtengo el "xxx no es válido sin transacción activa". Aquí hay un código de ejemplo que me da un error (ejecutar en 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: guardar no es válido 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 también obtuve el mismo error.
Este 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á marcada con @Transactional. Estoy usando hibernate 3.3.2 y primavera 2.5.6.
¿Puedo tener algún consejo sobre cómo solucionar este problema?
@hephestos: El valor para el parámetro current_session_context_class
decide el contexto al que se debe vincular la sesión (sesión de Hibernate).
Por defecto está enlazado con el hilo actualmente en ejecución. Pero cuando "jta" se usa para administrar transacciones, cambiar el valor de este parámetro a "jta" 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
Elimine la siguiente línea, interfiere con las transacciones administradas por Spring:
<property name="current_session_context_class">thread</property>