2

我目前正在尝试让 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();
    }
}
4

2 回答 2

0

在对话范围内拥有 EntityManager 只是等式的一方面,您的实体在什么范围内?

为了避免分离实体,它们也应该是对话范围的。

附带说明:我发现与其在长期运行的范围内处理实体,不如在每个请求范围内重新附加它们要容易得多。

于 2014-03-31T11:09:01.280 回答
0

延迟初始化异常实际上并非来自扩展持久性上下文或 CDI 或 DeltaSpike。这与此处描述的行为完全相同:selectManyCheckbox LazyInitializationException on process validation

JSF 2 克隆了我的实体的 PersistentBag,导致它被分离。我还撒了很多

<f:attribute name="collectionType" value="java.util.ArrayList" />

在我的 JSF 代码中。

于 2013-12-04T23:30:29.453 回答