六、实体合并方法
脱管实体在数据库中有一个持久化的标识符,但是不在当前的persistence contex中。这种状况是有可能存在的,比如如果你通过先前的串行化文件创建了一个 Player,或者你既没有清楚,也没有关闭实体管理器。那么你可以更新这个实体,或者通过 merge 方法来将它合并到 persistence context中去。
下面的代码演示了如何改变脱管实体 Team的比赛任务。 一旦你调用实体管理器的 clear 方法,Player实体就从 persistence context脱管出去了。同样,当你使用 close方法关闭实体管理器的时候,实体也会被脱管。虽说脱管的实体仍然在数据库中,但是实体管理器已经不在能激活管理它们了。
// The EntityManager, em, already exists for this example.
...
// We just happen to know that '5' is one of the
// player identifiers. You shouldn't normally hard-code this
// into any application.
Player p = em.find(Player.class, 5L);
em.clear();
// p is now detached for the convenience of this example
![]()
Team t = new Team("Ventura Surfers", "National");
p.setTeam(t);
![]()
em.getTransaction().begin();
Player managedPlayer = em.merge(p);
em.getTransaction().commit();
merge 命令使得被脱管的对象重返受管制的状态。另外,该命令返回了该实体的一个管制的副本。
