Cra*_*tis 4 java spring hibernate transactions h2
我们想要一个运行多个线程的简单单元测试 - 主要思想是主线程将一个保存提交到数据库,然后等待一个辅助线程来获取它.
我们发现必须为第二个Thread提交事务才能查询数据库并找到该项.否则,它将不存在.
我们试图使用H2数据库,Hibernate来管理访问,并且单元测试扩展AbstractTransactionalJUnit4SpringContextTests.
当我们尝试commit()现有的交易时:
... // Create and save our model object
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();
... // Create and start second Thread, query, etc.
Run Code Online (Sandbox Code Playgroud)
我们收到错误消息:
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)`
Run Code Online (Sandbox Code Playgroud)
但是当我们尝试仅扩展AbstractJUnit4SpringContextTests并使用@Transactional注释时:
@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {
Run Code Online (Sandbox Code Playgroud)
使用上面相同的提交代码,我们收到:
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)
Run Code Online (Sandbox Code Playgroud)
在我们第一次打电话给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)
Run Code Online (Sandbox Code Playgroud)
编辑带答案:
谢谢axtavt,我能够通过以下方式解决问题:
1)扩展 AbstractJUnit4SpringContextTests
2)使用@Autowired PlatformTransactionManager:
@Autowired
protected PlatformTransactionManager transactionManager;
Run Code Online (Sandbox Code Playgroud)
3)将我的交易代码放入:
TransactionStatus status = transactionManager.getTransaction(null);
... // The Model-Saving Code
transactionManager.commit(status);
Run Code Online (Sandbox Code Playgroud)
因此,您需要在测试方法中创建多个事务.正如您所看到的,您无法使用AbstractTransactionalJUnit4SpringContextTests,因为它为整个测试方法创建了单个事务,并且不能使用裸AbstractJUnit4SpringContextTests,因为它根本不创建任何事务.
解决方案是以AbstractJUnit4SpringContextTests编程方式使用和管理测试方法中的事务.
您需要注入PlatformTransactionManager测试,TransactionTemplate从中创建并使用它来划分您的事务,如11.6程序化事务管理中所述.
| 归档时间: |
|
| 查看次数: |
5213 次 |
| 最近记录: |