【问题标题】:Using AbstractTransactionalJUnit4SpringContextTests with commit halfway through在提交中途使用 AbstractTransactionalJUnit4SpringContextTests
【发布时间】:2013-04-05 11:26:09
【问题描述】:

我们想要一个运行多个线程的简单单元测试——这个想法是主线程提交一个保存到数据库,然后等待辅助线程来获取它。

我们发现必须提交事务,第二个线程才能查询数据库并找到项目。否则不存在。

我们正在尝试使用 H2 数据库、Hibernate 来管理访问,并且单元测试扩展了 AbstractTransactionalJUnit4SpringContextTests

当我们尝试commit()现有事务时:

... // Create and save our model object

sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();

... // Create and start second Thread, query, etc.

我们收到错误:

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:484)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:521)`

但是当我们尝试仅扩展 AbstractJUnit4SpringContextTests 并使用 @Transactional 注释时:

@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {

使用上面相同的提交代码,我们会收到:

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)

在我们第一次致电getCurrentSession()时。

有没有办法在 JUnit Transactional Spring 测试中途提交?

此外,当我们尝试使用 AbstractTransactionalJUnit4SpringContextTests 创建自己的嵌套事务时,我们会收到:

org.hibernate.TransactionException: nested transactions not supported
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)

编辑带答案:

感谢axtavt,我能够通过以下方式解决问题:

1) 扩展AbstractJUnit4SpringContextTests

2) 将@Autowired 用于PlatformTransactionManager

   @Autowired
   protected PlatformTransactionManager transactionManager;

3) 将我的事务代码放入:

TransactionStatus status = transactionManager.getTransaction(null);
... // The Model-Saving Code
transactionManager.commit(status);

【问题讨论】:

    标签: java spring hibernate transactions h2


    【解决方案1】:

    因此,您需要在测试方法中创建多个事务。如您所见,您不能使用AbstractTransactionalJUnit4SpringContextTests,因为它为整个测试方法创建单个事务,并且不能使用裸AbstractJUnit4SpringContextTests,因为它根本不创建任何事务。

    解决方案是使用AbstractJUnit4SpringContextTests 并以编程方式管理测试方法中的事务。

    您需要将PlatformTransactionManager 注入您的测试,从中创建TransactionTemplate 并使用它来划分您的事务,如11.6 Programmatic transaction management 中所述。

    【讨论】:

    • ...你是巫师吗?很长一段时间以来,任何 SO 答案都能如此迅速和完美地发挥作用。
    猜你喜欢
    • 2011-08-08
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2013-10-18
    • 2012-04-27
    相关资源
    最近更新 更多