本文共 1055 字,大约阅读时间需要 3 分钟。
在应用中,处于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 detachedsession.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 detachedentityManager.clear();person.setName( "Mr. John Doe" );person = entityManager.merge( person );
转载地址:http://nilai.baihongyu.com/