我们想要一个运行多个线程的简单单元测试——这个想法是主线程向数据库提交一个保存,然后等待辅助线程来获取它。
我们发现必须为第二个线程提交事务才能查询数据库并找到项目。否则,它将不存在。
我们正在尝试使用 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);