java - 为什么我的实体在两次调用后变得不受管理?

标签 java jpa seam

在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/

相关文章:

java - 如何使用 JPA native 查询将 List<Object> 转换为 POJO

java - 如何编译facelets?

java - 在 Seam 中更改标签默认属性的值

java - 图像存储即服务

java - JSP在数据库中搜索更多表

java - 在参数操作中插入枚举值

jakarta-ee - JPA 动态持久化单元名称

sql - QueryDsl:带有投影 bean 和 oneToMany 或 manyToMany 关联的异常 "argument type mismatch"

java - 调用java方法确认

java - 如何获取 Google 返回的 JSON 对象中的持续时间和距离?