我目前正在尝试让 CDI(更准确地说是 Weld)与 JSF 2 和长期对话一起工作。我在 @ConversationScoped 我的支持 bean 中开始对话。我还在创建一个@ConversationScoped 实体管理器。遗憾的是,当 JSF 尝试编写 @ManyToMany 映射字段时,我在我的支持 bean 中编辑的实体总是得到一个LazyInitializationException 。似乎实体与实体管理器分离。在我的 EntityManagerProducer(见下文)中,在抛出 LazyInitializationException 之前,不会调用方法createEntityManager(),所以我假设 entitymanager 实际上是会话范围的。
据我所知,DeltaSpike 还没有提供任何东西来处理 JSF 中的长时间运行的对话。任何人都可以提出一种方法来说明如何使用 Weld + DeltaSpike(最好在带有weld-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();
}
}