如何解决如何在 Micronaut/Kotest/Hibernate 测试中“获取当前线程的事务同步会话”
我正在尝试在每次测试后清理我的组件测试使用的数据库,以便下一次它是空白的。为此,我有如下内容:
@MicronautTest
class ExampleTest(
private val entityManager: EntityManager
) : BehaviorSpec() {
override fun afterEach(testCase: TestCase,result: TestResult) {
entityManager.transaction.begin()
entityManager.createQuery("delete from DeviceEntity").executeUpdate()
ementityManagertransaction.commit()
entityManager.clear()
}
/* test code */
}
但是,当我运行它时,我收到以下错误:
Could not obtain transaction-synchronized Session for current thread
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at io.micronaut.transaction.hibernate5.MicronautSessionContext.currentSession(MicronautSessionContext.java:100)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:479)
at io.micronaut.configuration.hibernate.jpa.TransactionalSessionInterceptor.intercept(TransactionalSessionInterceptor.java:56)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:82)
at io.micronaut.configuration.hibernate.jpa.TransactionalSession$Intercepted.unwrap(Unknown Source)
at uk.arqit.cloud.device.core.service.v1.services.component.example.ExampeTest.afterEach(IncrementRatchetSuccessTest.kt:56)
...
我在其他帖子中看到提到使用 @Transaction
来装饰方法或从会话工厂获取实体管理器,但使用这些时错误是相同的。
在我的测试(即测试代码所在的位置)的 init { ... }
子句中运行此代码没有问题,并且它完全按预期工作。但是,如果我在 afterEach
中运行它,则会出现问题。
谁能就如何解决这个问题提供一些建议?
谢谢!
解决方法
找到解决方法,先在构造函数中添加SessionFactory
:
@MicronautTest
class ExampleTest(
private val entityManager: EntityManager,private val sessionFactory: SessionFactory
) : BehaviorSpec() {
afterEach(...) {
...
}
}
在 afterEach
方法中有以下内容:
override fun afterEach(testCase: TestCase,result: TestResult) {
val sesh = sessionFactory.openSession()
val em = sesh.entityManagerFactory.createEntityManager()
/* do whatever you want with 'em' */
}
值得一提的是,您还可以在类主体中声明 sesh
和 em
,以便所有方法都可以访问它们
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。