两次通话后,为什么我的实体无法管理?

时间:2010-11-21 12:41:25

标签: java jpa seam

在seam-gen生成的应用程序中,我有一个在验证期间检查的用户实体。我在验证器中查找实体是否可用,如果是,我在UserHome.find()方法中加载实体。

如果它不可用,我想强制用户注册。这项工作到目前为止。

但是在后续调用中,如果我需要再次使用用户实体。 实体变得“不受管理”。我试图将它注入Scope.Session,但这也无济于事。

每次调用EntityHome.isManaged()都会抛出异常,因为EntityManager已经关闭。

  • 问题是谁关闭了entityManager,为什么?

  • 除了使用:

    之外,有没有办法防止seam关闭entityManager?
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    EntityManager entityManager;
    

2 个答案:

答案 0 :(得分:4)

entityManager是会话范围的。如果您未在请求中启动对话(使用@Begin),Seam会在请求后关闭entityManager。将实体注入会话范围无济于事,因为无论如何,entityManager都会关闭。

要防止Seam关闭entityManager,您可以使用扩展的持久性上下文,就像您自己提到的那样,或者使用会话范围的组件。根据组件的上下文和后续调用,使用会话范围可能不合适。

如果您将实体退出到会话范围。您可以使用entityManager.find(.)entityManager.getReference(.)在后​​续调用中将其重新附加到新的entityManager。

答案 1 :(得分:1)

@kraftan说了什么,我想补充以下内容:

通过注入

使用seam managed persistence context
@In EntityManager entityManager; 

如果您在components.xml中定义了

<persistence:managed-persistence-context
    name="entityManager" auto-create="true" persistence-unit-jndi-name="@puJndiName@" />

或者,如果您在Seam应用程序框架内,您可以说getEntityManger()并且您可以使用seam的托管实体管理器