複数のスレッドを実行する単純な単体テストが必要です。つまり、メイン スレッドがデータベースへの保存をコミットし、セカンダリ スレッドがそれを取得するのを待ちます。
2 番目のスレッドがデータベースにクエリを実行してアイテムを検索できるようにするには、トランザクションをコミットする必要があることがわかりました。そうでなければ、それは存在しません。
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);