您的位置:首页 > 其它

Hibernate中处于detached状态的Entity对象融合(merge)得到另一个persistent状态的Entity对象

2016-06-16 15:36 323 查看
hibernate应用中,处于detached状态的Entity对象,是指那些在数据库中有对应的记录,但是由于持久化上下文关闭close(),或持久化上下文清空clear(),或者被持久化上下文删除evict(),而导致与持久化上下文不再关联的Entity对象。

处于detached状态的Entity对象,虽然在Hibernate应用中仍然可以对其进行操作,但是这些操作的结果无法自动同步存储到数据库中。
Hibernate应用中,处于detached状态的Entity对象,可以通过融合操作(merge)得到另一个persistent状态的Entity对象。也就是说,对于一个处于detached状态的Entity对象,当持久化上下文对其进行merge()操作时,实际上首先是根据其标识符从数据库中获取数据并生成一个新的persistent状态的Entity对象,然后将该新的persistent状态的Entity对象的所有属性设置为与detached状态的Entity对象的属性一致(即将detached状态的Entity对象的数据复制到新的persistent状态的Entity对象),最后就是将新创建的persistent状态的Entity对象作为结果返回。这里要注意merge()与lock()/update()/saveOrUpdate()的区别。

1.Hibernate
Native API进行融合操作示例如下:

Person person = session.byId( Person.class ).load( personId );

//Clear the Session so the person entity becomes detached
session.clear();

person.setName( "Mr. John Doe" );
person = (Person) session.merge( person );

2.JPA API进行融合操作示例如下:

Person person = entityManager.find( Person.class, personId );

//Clear the EntityManager so the person entity becomes detached
entityManager.clear();

person.setName( "Mr. John Doe" );
person = entityManager.merge( person );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate entity merge