Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AbstractTransactionalJUnit4SpringContextTests,中途提交_Java_Spring_Hibernate_Transactions_H2 - Fatal编程技术网

Java 使用AbstractTransactionalJUnit4SpringContextTests,中途提交

Java 使用AbstractTransactionalJUnit4SpringContextTests,中途提交,java,spring,hibernate,transactions,h2,Java,Spring,Hibernate,Transactions,H2,我们需要一个运行多个线程的简单单元测试——其思想是主线程向数据库提交一个保存,然后等待一个辅助线程来获取它 我们发现必须提交事务,第二个线程才能查询数据库并找到该项。否则,它将不存在 我们正试图使用H2数据库、Hibernate来管理访问,以及单元测试扩展AbstractTransactionalJUnit4S普林gContextTests来实现这一点 当我们尝试commit()现有事务时: ... // Create and save our model object sessionFact

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

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

我们正试图使用H2数据库、Hibernate来管理访问,以及单元测试扩展
AbstractTransactionalJUnit4S普林gContextTests
来实现这一点

当我们尝试
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)`
但是,当我们尝试仅扩展
抽象JUnit4SpringContextTests
并使用
@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)
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)
在我们第一次调用
getCurrentSession()

有没有一种方法可以在JUnit事务性Spring测试中途提交?

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

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)
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用于
平台事务管理器

   @Autowired
   protected PlatformTransactionManager transactionManager;
3) 将我的事务代码放入:

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

因此,您需要在测试方法中创建多个事务。正如您所看到的,您不能使用
AbstractTransactionalJUnit4SpringContextTests
,因为它为整个测试方法创建了一个事务,而不能使用bare
AbstractJUnit4SpringContextTests
,因为它根本不创建任何事务

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


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

…您是向导吗?很长一段时间以来,任何这样的答案都没有如此迅速和完美地发挥作用。