Java Micronaut data Transactional无法获取当前线程的事务同步会话

Java Micronaut data Transactional无法获取当前线程的事务同步会话,java,hibernate,junit,micronaut,micronaut-data,Java,Hibernate,Junit,Micronaut,Micronaut Data,我必须用Micronaut数据和Hibernate测试一个悲观锁实现。当我运行JUnit测试用例时,使用命令gradletest它给出了错误 io.micronaut.context.exceptions.BeanInstantiationException:实例化[org.hibernate.Session]类型的bean时出错:无法获取当前线程的事务同步会话 但是,当在控制器上下文中调用该函数(orgAccountRepository.findTop1ByStatus)时,该函数正在按预期工

我必须用Micronaut数据和Hibernate测试一个悲观锁实现。当我运行JUnit测试用例时,使用命令
gradletest
它给出了错误

io.micronaut.context.exceptions.BeanInstantiationException:实例化[org.hibernate.Session]类型的bean时出错:无法获取当前线程的事务同步会话

但是,当在控制器上下文中调用该函数(orgAccountRepository.findTop1ByStatus)时,该函数正在按预期工作

更奇怪的是,当使用vs code java test runner执行测试时,测试会成功运行

此测试用于验证表行上的悲观写锁是否正常工作。所以本质上我必须创建多个并发事务来竞争获取锁,然后验证锁机制是否正常工作

有人能给我们一些关于用JUnit定义事务的建议吗

@存储库
公共抽象类OrgAccountRepository实现了Crudepository{
私人最终实体管理人实体管理人;
公共组织帐户存储库(EntityManager EntityManager){
this.entityManager=entityManager;
}
公共可选findTop1ByStatus(OrgAccountStatusName名称){
//使用悲观_写锁锁定结果行
List orgAccounts=entityManager
.createQuery(“从OrgAccount作为oa,其中oa.status=:status”,OrgAccount.class)
.setLockMode(LockModeType.悲观写入).setParameter(“状态”,名称)
.getResultList();
如果(orgAccounts.size()>0){
返回可选的.ofNullable(orgAccounts.get(0));
}
返回可选的空值(null);
}
}
@MicronautTest(环境={“测试”})
公共类锁定测试{
@注入
LockTableHelper LockTableHelper;
@试验
无效测试(){
线程t1=新线程(){
公开募捐{
lockTableHelper.testRun();
}
};
t1.start();
//
....
....
}
}
}
公共类LockTableHelper{
私有最终记录器log=LoggerFactory.getLogger(LockTableHelper.class);
@注入
OrgAccountRepository OrgAccountRepository;
@交易的
公共void testRun(){
可选帐户=
orgAccountRepository.findTop1ByStatus(OrgAccountStatusName.UNASSIGNED);
}
}

LockTableHelper缺少单例还是上下文注释?我在helper类中添加了@context注释。但是问题仍然存在。为什么要在测试中启动一个新线程?我认为这种方法的一个问题是,当测试运行时,你的CPU在做什么,测试方法可能在线程运行之前就完成了。@JeffScottBrown,我更新了这个问题来解释它。线程将创建多个并发事务,以测试表上的锁定机制。明白了。编辑之前的代码不会可靠地工作。