persist()方法和save()方法
persist()方法是在Hibernate3版本中才出现的,实现了EJB3规范中定义的持久化语义,persist()方法不保证立即为持久化对象的OID赋值,而是有可能在Session清理缓存时才为OID赋值.
session.save()方法并不立即执行SQL insert语句,只有当Session清理缓存时,才会执行SQL语句,如果在save()方法后,又修改了持久化对象的属性,清理缓存时会额外执行SQL update语句.
load()和get()方法
都能根据给定OID从数据库中加载一个持久化对象.当数据库中不存在与OID对应的记录时,load()方法抛出org.hibernate.ObjectNotFoundException异常,而get()方法返回null.检索策略不同,默认情况下load()方法会采用延迟检索策略加载持久化对象,除非lazy=false,而get()方法总是采用立即检索策略.
如果加载一个对象的目的是为了访问它的各个属性,可以用get()方法
如果加载一个对象的目的是为了删除或建立与别的对象的关联关系,可以用load()方法.
update()方法
只有在清理缓存的时候才会执行update语句,因此多次修改对象属性也只执行一次update.
如果希望session仅当修改了对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,默认false,修改后会先执行select进行比较.
saveOrUpdate()方法
如果传入参数是临时对象,调用save()方法,如果参数是游离对象,调用update()方法,如果参数是持久化对象,直接返回.
如果满足以下情况之一,Hibernate把它当做临时对象,否则作为游离对象.
1. Java对象的OID取值为null.
2. Java对象具有version版本控制属性并且取值为null.
3. 在映射文件中为<id>元素设置了unsaved-value属性,并且Java对象的OID取值与这个unsaved-value属性值匹配
4. 在映射文件中为version版本控制属性设置了unsaved-value属性,并且Java对象的version版本控制属性的取值与映射文件中unsaved-value属性值匹配.
5. 为Hibernate的Interceptor提供了自定义的实现,并且Interceptor实现类的isUnsaved()方法返回Boolean.TRUE
merge()方法
把一个游离对象的属性复制到一个持久化对象中.
merge()方法处理流程:
1. 根据游离对象的OID到session缓存中查找匹配的持久化对象.
2. 如果在缓存中没有找到与游离对象的OID一致的持久化对象,就根据这个OID从数据库中加载持久化对象.如果在数据库中存在这样的持久化对象,就把游离对象的属性复制到这个刚加载的持久化对象中,计划执行一条update语句,再返回这个持久化对象的引用.
3. 如果merge()方法的参数是一个临时对象,那么也会创建一个新的对象,把临时对象的属性复制到这个新建的对象中,再调用save()方法持久化这个独享,最后返回这个持久化对象的引用.
delete()方法
从数据库中删除一个Java对象,可以删除持久化对象,游离对象.
delete()方法处理过程:
1. 如果参数是游离对象,先使游离对象被当前session关联,使它变为持久化对象.如果参数是持久化对象则忽略这一步.此步骤确保使用拦截器的场合下,拦截器能正常工作.
2. 计划执行一个delete语句
3. 把对象从Session缓存中删除,该对象进入删除状态.
如果设置hibernate.use_identifier_rollback为true,delete()方法会把持久化对象或游离对象的OID置为null,使它们转变为临时对象,这样程序就可以重复使用这些临时对象了.
replicate()方法
把一个数据库中的对象复制到另一个数据库中.
第二个参数复制模式:
ReplicationMode.IGNORE:如果在目标数据库中已经存在OID相同的对象,无操作.
ReplicationMode.OVERWRITE:如果目标数据库中已经存在OID相同的对象,覆盖.
ReplicationMode.EXCEPTION:如果目标数据库中已经存在OID相同的对象,抛异常.
ReplicationMode.LAST_VERSION:如果目标数据库中已经存在OID相同的对象,比较两个对象的版本,新则覆盖,否则无操作.要求Hibernate采用的乐观锁并发控制.
session在清理缓存时,按如下顺序执行SQL语句
按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句.
执行所有对实体进行更新的update语句.
执行所有对集合进行删除的delete语句.
执行所有对集合元素进行删除,更新或者插入的SQL语句.
执行所有对集合进行插入的insert语句.
按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句.
如果对象使用native生成器来生成OID,那么当调用session的save()方法保存该对象时,会立即执行向数据库插入该实体的insert语句.
默认情况下,session会在以下时间点清理缓存
当应用程序调用org.hibernate.Transaction的commit()方法时候,先清理缓存,再向数据库提交事务.
当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使session缓存与数据库同步,保证查询结果正确.
当应用程序显示调用session的flush()方法时.
改变清理缓存时间点
session.setFlushMode(FlushMode.COMMIT)
清理缓存的模式
|
各种查询方法
|
Transaction的commit()
|
Session的flush()
|
FlushMode.AUTO(默认)
|
清理
|
清理
|
清理
|
FlushMode.COMMIT
|
不清理
|
清理
|
清理
|
FlushMode.NEVER
|
不清理
|
不清理
|
不清理
|
分享到:
相关推荐
本文主要介绍了Hibernate三种状态和Session常用的方法,具有很好的参考价值,下面跟着小编一起来看下吧
主要介绍了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量处理数据等的常用技巧及注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下
Hibernate的第二级缓存是一个插件,下面是几种常用的缓存插件: EhCache SwarmCache JBossCache等. 其中,EhCache是Hibernate的默认的插件. 四 EhCache的使用 第一步:修改Hibernate配置文件,启用...
第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...
SessionSession接口接口 TransactionTransaction接口接口 QueryQuery等接口等接口 熟练使用熟练使用HibernateHibernate的各个接口的各个接口 使用使用HiberntaeHiberntae的的HQLHQL语言进行数据库访问语言进行数据库...
3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 3.6.2 创建helloapp应用的目录结构 3.6.3 把helloapp应用作为独立应用程序运行 3.6.4 把helloapp应用作为...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
有效的Session管理:Spring提供了有效、简单、安全的Hibernate Session处理。 IoC容器降低了DAO组件与业务逻辑层之间的耦合性。 DAO模式的使用,降低了系统重构的代价。 方便的事务管理:Spring提供的声明式事务处理...
session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes----->Student) 13 hihernate一对多关联映射(双向Classes<----->Student)(常用) 14 hibernate一对多双向自连接关联映射...
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...
第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...
1、进一步掌握 Hibernate 应用的开发方法,理解 Hibernate 配置文件中主要元素 的作用,会开发持久化类,并进行相应的 Hibernate 映射文件配置; 2、学习并掌握 Hibernate 框架的常用 API,掌握利用 Hibernate 基本 ...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 3.6.2 创建helloapp应用的目录结构 3.6.3 把helloapp应用作为独立应用程序运行 3.6.4 把helloapp应用作为...
3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 3.6.2 创建helloapp应用的目录结构 3.6.3 把helloapp应用作为独立应用程序运行 3.6.4 把helloapp应用作为...
3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 3.6.2 创建helloapp应用的目录结构 3.6.3 把helloapp应用作为独立应用程序运行 3.6.4 把helloapp应用作为...
5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 6.1.1 Log4j历史 6.1.2 Log4j组成 6.2 建立Log4j的开发环境 6.2.1...
5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 6.1.1 Log4j历史 6.1.2 Log4j组成 6.2 建立Log4j的开发环境 6.2.1...
总结hibernate框架的常用检索方式 1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC...