Hibernate:2个会话上存在非法代理关联

Hibernate:2个会话上存在非法代理关联,hibernate,jakarta-ee,jpa,transactions,stateless-session-bean,Hibernate,Jakarta Ee,Jpa,Transactions,Stateless Session Bean,我目前正在做一项工作,它可以从输入文件自动执行订阅过程 所以我有一门课: @Startup @Singleton public class ImportSubscriptionsJob implements Job { //calls ImportSubscriptionsJobBean } Singleton类调用无状态类: @Stateless public class ImportSubscriptionsJobBean { @PersistenceContext

我目前正在做一项工作,它可以从输入文件自动执行订阅过程

所以我有一门课:

@Startup
@Singleton
public class ImportSubscriptionsJob implements Job { 
    //calls ImportSubscriptionsJobBean
}
Singleton类调用无状态类:

@Stateless
public class ImportSubscriptionsJobBean { 

    @PersistenceContext
    private EntityManager em;

    //we need a transaction
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    @Interceptors({ JobLoggingInterceptor.class })
    public void execute() {
        //calls another stateless class with em injected
    }
}
这个类调用另一个无状态类,以此类推。由于循环依赖性,一些类用@LocalBean注释,因此需要通过@EJB注入它们

entityManager从第2级传递到第N级

现在的问题是在第n级服务呼叫上,我遇到了下面的错误。这是层次结构:

单例[1]->无状态(TX=REQUIRES_NEW)[2]->无状态 (TX=REQUIRES_NEW)[3]->无状态[4]->无状态[5]->无状态[6]->无状态[7]

在第6级,它从第7级调用一个方法,该方法只需查询entityX:

List<X> Xs = getQuery(em).getResultList();
注意,我的事务是container manage,所以我想知道为什么会出现这个错误:-

如果我在第一个无状态类中只保留一个REQUIRES_NEW,我将得到:

JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
但是为什么我的所有类都用无状态注释呢?默认情况下,它是一个会话bean,如果不存在,所有方法都可以启动新的tx。

问题在于:

Stateless (TX=REQUIRES_NEW)[2]->Stateless (TX=REQUIRES_NEW)
如果您有2个REQUIRES_NEW,那么在您的流程中将有两个打开的事务,并且您可能将同一实体与两个并发会话关联

尝试将事务传播更改为需要

从事务管理的角度来看,有状态EJB和无状态EJB之间的唯一区别是在有状态EJB字段中有实体引用时,或者在使用扩展持久性上下文时。在这种情况下,将这两者混合起来就困难多了。从有状态EJB调用无状态EJB时,需要将实体作为方法参数传递给它


至于事务传播,我认为没有理由不能对所有此类调用使用相同的事务。事实上,这对于拥有单个原子工作单元来说是强制性的。

Hi@Vlad您的意思是REQUIRED,我已经尝试过了,但是没有第二个REQUIRES\u,它抛出的新事务是REQUIRED错误。请注意,除了单例之外,这些类都是无状态的,所以我也不知道为什么。
Stateless (TX=REQUIRES_NEW)[2]->Stateless (TX=REQUIRES_NEW)