当一个实体停止在JPA中管理时

时间:2014-03-15 15:24:27

标签: jpa entity

我在JavaEE中谈论JPA。在我读过的一本书中谈到:

EntityManager em;
em.find(Employee.class, id);

"这是实体管理器在数据库中查找实例所需的所有信息,当调用完成时,返回的员工将是一个管理实体,这意味着它将存在于当前与实体管理器关联的持久化上下文 - pro-ejb3-jpa"。 但我不知道实体什么时候停止管理,如果我想更新,我必须再次管理merge(),删除......

2 个答案:

答案 0 :(得分:4)

默认情况下,持久性上下文绑定到事务。因此,在提交或回滚事务时关闭上下文。一旦关闭,由持久化上下文管理的实体就会变得不受管理。

答案 1 :(得分:3)

有几种情况下实体变得分离,它取决于实体管理器以及持久化上下文如何与它相关联。

  1. 正如@JB Nizet所说,如果事务属于容器管理器事务范围持久化上下文,则实体在提交时会分离。
  2. 当有状态bean调用@Remove方法它们属于容器管理器扩展持久化上下文时,实体变得分离,这里实体仍然在几次方法调用之后进行管理,并提交TX直到有状态bean结束生命周期。
  3. 如果应用程序在实体管理器上调用方法clear,则所有实体都将分离。 em.clear()
  4. 如果TX标记为回滚,则所有实体将在事务范围EM中分离。
  5. 如果在实体管理器上调用方法分离,则将托管实体作为参数传递,它将分离实体。 em.detach(java.lang.Object)
  6. 在关闭实体管理器的应用程序托管持久性上下文中,所有实体都将分离。 em.close

    正如你所说,Merge将采用一个分离的实体并使其由持久化上下文管理,基本上一个分离的对象是一个特殊状态的对象,它不由任何EntityManager管理,但仍然代表数据库中的对象。 / p>

    基于他们在下面评论并根据规格

    如果X是分离的实体,则将X的状态复制到预先存在的管理实体实例X'相同的身份或新的托管副本X'创建了X