代码之家  ›  专栏  ›  技术社区  ›  stacker

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

  •  2
  • stacker  · 技术社区  · 15 年前

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

    如果不可用,我想强制用户注册。到目前为止这是有效的。

    但在随后的调用中,如果我需要再次使用用户实体。 实体变为“非托管”。我试着把它排除在范围之外,但这也没用。

    每次呼叫 EntityHome.isManaged() 引发异常,因为EntityManager已关闭。

    • 问题是谁关闭了实体管理器,为什么?.

    • 除使用以下方法外,是否有其他方法防止seam关闭entityManager:

      @PersistenceContext(type=PersistenceContextType.EXTENDED)
      EntityManager entityManager;
      
    2 回复  |  直到 15 年前
        1
  •  4
  •   kraftan    15 年前

    entityManager是会话范围的。如果你不开始谈话 @Begin )在请求中,Seam在请求之后关闭entityManager。将实体排除到会话作用域中没有帮助,因为entityManager无论如何都会关闭。

    为了防止Seam关闭entityManager,您可以使用自己提到的扩展持久性上下文,或者使用会话范围的组件。根据组件的上下文和随后的调用,使用会话作用域可能不合适。

    如果将实体排除在会话范围之外。在随后的调用中,可以使用 entityManager.find(.) entityManager.getReference(.) .

        2
  •  1
  •   Shervin Asgari    15 年前

    卡夫坦说了什么,我想补充一下:

    通过注入使用seam管理的持久性上下文

    @In EntityManager entityManager; 
    

    如果您在components.xml中定义了

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

    或者,如果您在Seam应用程序框架中,您可以说 getEntityManger() 你可以和seam的托管实体管理器一起工作