我有一个SessionScoped托管bean(UserInfoController)和一个Injected Stateless Session bean(UserInfoService)。
UserInfoController调用UserInfoService来更新UserInfo记录。UserInfoService加载适当的UserInfo记录,对其进行修改,最后调用em.flush();
当使用CDI注释(javax.enterprise.context.SessionScoped)注释托管bean UserInfoController时,除非使用PersistenceContextType.EXTENDED.注释无状态bean的实体管理器,否则不会更新用户记录
当使用JSF注释(javax.faces.bean.SessionScoped)对托管bean进行注释时,当使用PersistenceContextType.TRANSACTION.时,记录会成功更新
有人能解释这种行为吗?不管调用方是JSF还是CDI SessionScoped托管Bean,事务边界难道不应该局限于无状态Bean吗?(未定义TransactionAttributeType:应默认为REQUIRED)
如有任何信息,我们将不胜感激!谢谢Ben
PersistenceContext类型取决于EJB会话bean,而不是像本链接中所解释的那样依赖于后台bean。事务范围的Persistence上下文和扩展的PersistenceContext之间有什么区别?
在我的案例中,我使用的是具有默认PersistenceContext类型(TRANSACTION)的@Named CDI bean,并且当我使用javax.enterprise.context.SessionScoped 时,记录更新成功