`
gary0416
  • 浏览: 330751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate session的常用方法

阅读更多

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.         HibernateInterceptor提供了自定义的实现,并且Interceptor实现类的isUnsaved()方法返回Boolean.TRUE

 

merge()方法

把一个游离对象的属性复制到一个持久化对象中.

merge()方法处理流程:

1.         根据游离对象的OIDsession缓存中查找匹配的持久化对象.

2.         如果在缓存中没有找到与游离对象的OID一致的持久化对象,就根据这个OID从数据库中加载持久化对象.如果在数据库中存在这样的持久化对象,就把游离对象的属性复制到这个刚加载的持久化对象中,计划执行一条update语句,再返回这个持久化对象的引用.

3.         如果merge()方法的参数是一个临时对象,那么也会创建一个新的对象,把临时对象的属性复制到这个新建的对象中,再调用save()方法持久化这个独享,最后返回这个持久化对象的引用.

 

delete()方法

从数据库中删除一个Java对象,可以删除持久化对象,游离对象.

delete()方法处理过程:

1.         如果参数是游离对象,先使游离对象被当前session关联,使它变为持久化对象.如果参数是持久化对象则忽略这一步.此步骤确保使用拦截器的场合下,拦截器能正常工作.

2.         计划执行一个delete语句

3.         把对象从Session缓存中删除,该对象进入删除状态.

 

如果设置hibernate.use_identifier_rollbacktrue,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,那么当调用sessionsave()方法保存该对象时,会立即执行向数据库插入该实体的insert语句.

 

默认情况下,session会在以下时间点清理缓存

当应用程序调用org.hibernate.Transactioncommit()方法时候,先清理缓存,再向数据库提交事务.

当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使session缓存与数据库同步,保证查询结果正确.

当应用程序显示调用sessionflush()方法时.

 

改变清理缓存时间点

session.setFlushMode(FlushMode.COMMIT)

清理缓存的模式

各种查询方法

Transactioncommit()

Sessionflush()

FlushMode.AUTO(默认)

清理

清理

清理

FlushMode.COMMIT

不清理

清理

清理

FlushMode.NEVER

不清理

不清理

不清理

 

1
0
分享到:
评论

相关推荐

    Hibernate三种状态和Session常用的方法

    本文主要介绍了Hibernate三种状态和Session常用的方法,具有很好的参考价值,下面跟着小编一起来看下吧

    Hibernate管理Session和批量操作分析

    主要介绍了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量处理数据等的常用技巧及注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下

    hibernate基础教程

    Hibernate的第二级缓存是一个插件,下面是几种常用的缓存插件: EhCache SwarmCache JBossCache等. 其中,EhCache是Hibernate的默认的插件. 四 EhCache的使用 第一步:修改Hibernate配置文件,启用...

    深入浅出Hibernate中文版 part1

    第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...

    Hibernate常用API

    SessionSession接口接口 TransactionTransaction接口接口 QueryQuery等接口等接口 熟练使用熟练使用HibernateHibernate的各个接口的各个接口 使用使用HiberntaeHiberntae的的HQLHQL语言进行数据库访问语言进行数据库...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...

    第24次课-1 Spring与Hibernate的整合

    有效的Session管理:Spring提供了有效、简单、安全的Hibernate Session处理。 IoC容器降低了DAO组件与业务逻辑层之间的耦合性。 DAO模式的使用,降低了系统重构的代价。 方便的事务管理:Spring提供的声明式事务处理...

    hibernate学习笔记

    session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes-----&gt;Student) 13 hihernate一对多关联映射(双向Classes&lt;-----&gt;Student)(常用) 14 hibernate一对多双向自连接关联映射...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    深入浅出Hibernate中文版 part2

    第7章 常用Hibernate映射配置说明 7.1 hibernate-mapping节点 7.2 class节点定义 7.3 id节点定义 7.4 属性/字段映射配置 第8章 Hibernate工具 8.1 准备工作 8.2 根据数据库定义生成映射文件——MiddleGen ...

    hibernate-prj2

    1、进一步掌握 Hibernate 应用的开发方法,理解 Hibernate 配置文件中主要元素 的作用,会开发持久化类,并进行相应的 Hibernate 映射文件配置; 2、学习并掌握 Hibernate 框架的常用 API,掌握利用 Hibernate 基本 ...

    精通Hibernate:对象持久化技术第二版part3

    本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把helloapp应用作为独立应用程序运行  3.6.4 把helloapp应用作为...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (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...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    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...

    JSP开发中hibernate框架的常用检索方式总结

    总结hibernate框架的常用检索方式 1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC...

Global site tag (gtag.js) - Google Analytics