Usé esta anotación con éxito para una clase de Dao. Y la reversión funciona para las pruebas.
Pero ahora necesito revertir el código real, no solo las pruebas. Hay anotaciones especiales para usar en pruebas. Pero, ¿qué anotaciones son para código que no es de prueba? Es una gran pregunta para mí. Ya pasé un día para eso. La documentación oficial no satisfizo mis necesidades.
class MyClass { // this does not make rollback! And record appears in DB.
EmployeeDaoInterface employeeDao;
public MyClass() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "HibernateDaoBeans.xml" });
employeeDao = (IEmployeeDao) context.getBean("employeeDao");
}
@Transactional(rollbackFor={Exception.class})
public void doInsert( Employee newEmp ) throws Exception {
employeeDao.insertEmployee(newEmp);
throw new RuntimeException();
}
}
employeeDao es
@Transactional
public class EmployeeDao implements IEmployeeDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void insertEmployee(Employee emp) {
sessionFactory.getCurrentSession().save(emp);
}
}
Y aquí hay una prueba para la que las anotaciones funcionan bien:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/HibernateDaoBeans.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@Transactional
public class EmployeeDaoTest {
@Autowired
EmployeeDaoInterface empDao;
@Test
public void insert_record() {
...
assertTrue(empDao.insertEmployee(newEmp));
}
HibernateDaoBeans.xml
...
<bean id="employeeDao" class="Hibernate.EmployeeDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
...
** SÍ, revoqué la transacción. Acabo de agregar BEAN para el servicio ... y luego la anotación @Transactional comienza a funcionar :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
¡Gracias a todos, Rusia no los olvidará!
@Transactional
anotación. De lo contrario, cada llamada DAO comienza y confirma una nueva transacción antes de lanzar una excepción en el servicio. La conclusión es: la excepción debe dejar (escapar) un método marcado como@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
configurado en su contexto de primavera? Si habilita elorg.springframework.transaction
registrador, ¿muestra algo interesante?o programáticamente
fuente
Puede lanzar una excepción sin marcar del método que desea revertir. Esto se detectará en primavera y su transacción se marcará solo como reversión.
Supongo que estás usando Spring aquí. Y supongo que las anotaciones a las que hace referencia en sus pruebas son las anotaciones basadas en pruebas de primavera.
y tenga en cuenta que:
fuente
Para mí rollbackFor no fue suficiente, así que tuve que poner esto y funciona como se esperaba:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
Espero que ayude :-)
fuente
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
continuación, ayudaste