在Seam-gen生成的应用程序中,我有一个在身份验证期间检查的用户实体。我在身份 validator 中查找该实体是否可用,如果是,我会在 UserHome.find() 方法中加载该实体。
如果不可用,我想强制用户注册。到目前为止这有效。
但是在后续调用中如果我需要再次使用用户实体。 该实体变得“不受管理”。我尝试将其输出到 Scope.Session 中,但这也没有帮助。
每次调用 EntityHome.isManaged()
都会抛出异常,因为 EntityManager 已经关闭。
问题是谁关闭了entityManager,为什么?
除了使用之外,还有其他方法可以防止seam关闭entityManager吗:
@PersistenceContext(type=PersistenceContextType.EXTENDED) EntityManager entityManager;
最佳答案
entityManager 是 session 范围的。如果您没有在请求中开始对话(使用@Begin
),Seam 会在请求后关闭entityManager。将实体输出到 session 范围没有帮助,因为实体管理器无论如何都会关闭。
为了防止Seam关闭entityManager,您可以使用您自己提到的扩展持久性上下文,或者使用对话范围的组件。根据组件的上下文以及后续调用,使用对话范围可能不合适。
如果将实体输出到 session 范围。您可以在后续调用中使用 entityManager.find(.)
或 entityManager.getReference(.)
将其重新附加到新的entityManager。
关于java - 为什么我的实体在两次调用后变得不受管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237860/