在seam-gen生成的应用程序中,我有一个在验证期间检查的用户实体。我在验证器中查找实体是否可用,如果是,我在UserHome.find()
方法中加载实体。
如果它不可用,我想强制用户注册。这项工作到目前为止。
但是在后续调用中,如果我需要再次使用用户实体。 实体变得“不受管理”。我试图将它注入Scope.Session,但这也无济于事。
每次调用EntityHome.isManaged()
都会抛出异常,因为EntityManager已经关闭。
问题是谁关闭了entityManager,为什么?
除了使用:
之外,有没有办法防止seam关闭entityManager?@PersistenceContext(type=PersistenceContextType.EXTENDED)
EntityManager entityManager;
答案 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的托管实体管理器