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)