我目前正试图让CDI (更准确地说,是Weld)使用JSF 2并进行长时间的对话。我在@ConversationScoped我的支持豆开始对话。我还创建了一个@ConversationScoped实体管理器。遗憾的是,当JSF试图编写@ManyToMany映射字段时,我在后台bean中编辑的实体总是得到一个LazyInitializationException。实体似乎与实体管理器分离。在我的EntityManagerProducer (参见下面)中,方法createEntityManager()并不是抛出的LazyInitializationException,所以我假设实体管理器实际上是会话作用域。但据我所知,我的代码不会生成扩展的持久性上下文(因为我无法理解如何以编程的方式实现这一点)。
据我所知,DeltaSpike还没有提供任何用于处理JSF中长时间运行的会话的功能。有人能建议如何使用Weld + DeltaSpike (最好是在带有焊缝-servlet的Tomcat上)实现与CDI的长时间会话吗?
@ApplicationScoped
public class EntityManagerProducer {
@Inject
@PersistenceUnitName("myUnit")
private EntityManagerFactory emf;
@Produces
@ConversationScoped
public EntityManager createEntityManager() {
return emf.createEntityManager();
}
public void closeEm(@Disposes EntityManager em) {
em.close();
}
}发布于 2013-12-04 23:30:29
延迟初始化异常实际上并不来自扩展的持久性上下文或CDI或DeltaSpike。它与这里描述的行为完全相同:selectManyCheckbox LazyInitializationException on process validation
JSF 2克隆我的实体的PersistentBag,导致它被分离。我还四处奔波
<f:attribute name="collectionType" value="java.util.ArrayList" />贯穿我的JSF代码。
发布于 2014-03-31 11:09:01
会话作用域中的EntityManager只是方程的一个方面,您的实体在哪个范围内?
为了避免分离实体,还应该限定会话范围。
顺便提一句:我发现,与长期运行的实体不同,在每个请求范围中重新附加它们要容易得多。
https://stackoverflow.com/questions/20383443
复制相似问题