用`.createSQLQuery`截断后,spring / hibernate不回滚事务

时间:2017-04-15 14:52:15

标签: mysql spring hibernate junit transactions

我无法理解为什么Spring @Transactional测试方法Hibernate不会回滚在@Before中进行的更改? information @Before在一个事务中调用@Test@Test @RunWith(SpringJUnit4ClassRunner.class) @Transactional(defaultRollback = true, transactionManager = "transactionManager") public class TestClass { @Autowired private SessionFactory sessionFactory; @Autowired private EntityDao entityDao; @Before public void before() { // create arbitrary entity Entity one = Utils.createEntity(); // save with HibernateDao to table_1 entityDao.save(one); } @Test public void test() { sessionFactory.getCurrentSession().createSQLQuery("TRUNCATE table_2").executeUpdate(); } } 。可以考虑配置所有上下文。

createSQLQuery().executeUpdate

如果没有@Before,{{1}}中的所有更改都会根据需要进行回滚。

1 个答案:

答案 0 :(得分:0)

Mysql中的

TRUNCATE查询隐式提交事务(因为它被认为是一个DDL查询:它删除并重新创建一个表)。 DDL查询通常会导致提交。

如果您需要具有交易效果良好的替代方案,则可以使用DELETE FROM <table-name>

<强>更新

更多信息:Do DDL statements always give you an implicit commit, or can you get an implicit rollback?