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 );
处于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 );
相关文章推荐
- C# Entity Framework中的IQueryable和IQueryProvider详解
- SQLServer中merge函数用法详解
- 使用Entity Framework(4.3.1版本)遇到的问题整理
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- SQL中Merge用法详解
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- 浅析Java的Hibernate框架中的继承关系设计
- Hibernate实现批量添加数据的方法