简短答案
存储库初始化会中断事务。通过添加
@Eager到存储库实例中,在不同的线程/事务中预先初始化存储库。
说明
Spring Data存储库实例
@ApplicationScoped根据需要进行初始化。执行对存储库的首次访问的线程(和事务)用于初始化。
Spring Data JPA存储库初始化有两件事,其中之一是试图弄清楚是否为存储库查询方法提供了命名查询。不幸的是,JPA没有提供API来检查是否存在命名查询,因此我们依赖
EntityManager.createNamedQuery(…)。如果没有命名查询,则
EntityManager引发异常
并中止事务 。
在稍后的阶段,您的EJB方法
EntityManager在同一线程(和事务)中使用。它检查活动交易。因为该事务被标记为仅回滚,所以您会看到异常。
解决方法
添加
@Eager到您的存储库声明。Spring Data CDI扩展将在启动时初始化存储库:
@Eagerpublic interface TestRepository extends CrudRepository<TestEntity, Long> { // …}暗示
您不需要
@Repository上
TestRepository。Spring
Data通过选择来自Bean的后代
org.springframework.data.repository.Repository或带有注释的纯接口来选择存储库
@RepositoryDefinition。
persistence.xml不需要您中的事务管理器属性,WildFly已经使用所需设置配置了持久性上下文。
参考文献:
- DATAJPA-724
- DATAJPA-617
- 将Spring Data JPA与EJB / CDI结合使用时,对存储库的初始请求产生奇怪的异常



