攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)
一、Hibernate缓存简介:
Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存、更新、删除和加载Java对象的方法。
Session具有一个缓存,位于缓存中的对象称为持久化对象,Session能够在某些时间点来同步更新数据库,这一过程即为清理缓存。
Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态和删除状态。
二、Session的缓存:
Session的缓存由一系列Java集合构成的。
1、Session缓存的作用:
A、减少访问数据库的频率。
B、当缓存中的持久化对象之间存在循环关联关系时,Session保证不会出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。
C、保证数据库中的相关记录和缓存中的相应对象保存同步。Session通过在清理缓存时进行脏检查来同步。
2、脏检查及清理缓存的机制:
当一个对象被加入到Session缓存中时,Session会为该对象的值类型的属性复制一份快照。在清理缓存进行脏检查时,就是拿对象的当前属性和它的快照进行对比,据此判断是否发生了变化。
另外,当对象属性发生变化时,Session并不会立即清理缓存和执行相关的SQL操作,而是在特定的时间才清理缓存。这样的好处就是Session能够把几条相关的SQL语句合并为一条SQL,从而减少访问数据库的次数。
Session清理缓存时,按照以下顺序执行SQL语句(了解):
A、按照session.save()方法先后顺序,执行所有对实体进行插入的insert语句。
B、执行所有对实体进行更新的update语句。
C、执行所有对集合进行删除的delete语句。
D、执行所有对集合元素进行删除、更新或者插入的SQL语句。
E、执行所有对集合进行插入的insert语句。
F、按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。
Session会在以下时间点清理缓存:
A、当应用程序调用org.hibernate.Transaction分commit()方法时,先清理缓存,再提交事务。
B、当应用程序执行一些查询操作时,如果缓存中的持久化对象属性发生了变化,就会先清理缓存。
C、当应用程序显式调用Session的flush()方法的时候。
例外情况:如果对象使用native生成器来生成OID,name当调用Session的 save()方法保存对象时,会立即执行insert语句。
也可以通过Session.setFlushMode()方法来显式的设定清理缓存的时间点。
多数情况下应用程序不需要显式的调用flush()方法,以下常见除外:
A、插入、删除或更新某个持久化对象会引发数据库中触发器的时候。
B、在应用程序中混合使用Hibernate API和JDBC API的时候。
C、JDBC驱动程序不健壮,导致Hibernate在自动清理缓存模式下无法正常工作的时候。
三、Java对象在Hibernate持久化层的状态:
1、状态描述:
A、临时状态(transient):刚用new语句创建,还没有被持久化,并且不处于Session的缓存中。
B、持久化对象(persistent):已经被持久化,并且加入到Session缓存中。
C、删除状态(delete):不再处于Session的缓存中,并且Session已经计划将其从数据库中删除。
D、游离状态(detached):已经被持久化,但是不再处于Session的缓存中。
2、状态转换图:
3、临时对象的特征:
A、在使用代理主键的情况下,OID通常为NULL。
B、不处于Session的缓存中,不被任何一个Session实例关联。
C、在数据库中没有对应的记录。
四、持久化对象的特征:
1、OID不为null。
2、位于一个Session实例的缓存中。持久化对象总是被一个Session实例关联。
3、持久化对象和数据库中的相关记录对应。
4、Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
五、被删除对象的特征:
1、OID不为null。
2、从一个Session实例的缓存中删除。
3、被删除对象和数据库中的相关记录对应。
4、Session已经计划将其从数据库中删除。
5、Session在清理缓存时,会执行SQL delete语句,删除数据库中的相应记录。
6、一般情况下,应用程序不应该再使用被删除的对象。
六、游离对象的特征:
1、OID不为null。
2、不再位于Session的缓存中。
3、游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它相对应的记录。
游离对象和临时对象的相同之处:两者都不被Session关联,因此不会保证它们的属性变化与数据库保存同步。
游离对象和临时对象的不同之处:游离对象是由持久化对象转变过来的,因此数据库中可能存在对应的记录,而临时对象在数据库中没有与之对应的记录。
游离对象与被删除对象的相同之处:两者都不位于Session的缓存中,并且数据库中都可能存在对应的记录。
游离对象与被删除对象的不同之处:游离对象与Session完全脱离关系,而对于被删除对象,Session会计划将其从数据库中删除,在清理缓存时会执行删除操作。
七、Session接口的详细用法:
1、Session的save()和persist()方法:
save()方法使一个临时对象转变为持久化对象。注意应该禁止应用程序修改OID。
persist()方法和save()方法类似,区别在于该方法是在Hibernate3版本中财出现的。且如果在事务边界以外调用persist()方法时,不会执行SQL insert语句。
2、Session的load()和get()方法:
这两个方法都能根据给定的OID从数据库中加载一个持久化对象。
区别在于:
A、当数据库中不存在与OID对应的记录时,load()方法抛出OjbectNotFoundException,而get()方法返回null。
B、两者采用不同的检索策略(检索策略后续描述)。load()方法根据<class>元素的lazy属性决定是否进行懒加载,而get()方法会忽略lazy属性,采用立即检索策略。
使用场景:
A、如果加载一个对象的目的是访问它的各个属性,可以用get()方法。
B、如果加载一个对象时为了删除它,或者威力建立和别的对象的关联,可以用load()方法。
3、Session的update()方法:
update()方法使一个游离对象转变为持久化对象,并计划执行一条update语句。
如果希望Session仅在修改了对象的属性时才执行update语句,可以把<class>元素的select-before-update设置为true。
当update()方法关联一个游离对象时,如果在Session缓存中已经存在相同OID的持久化对象,会抛出异常。
4、Session的saveOrUpdate()方法:
saveOrUpdate()方法同时包含了save()和update()方法。如果传入的参数是临时对象,调用save()方法;如果传入的参数是游离对象,就调用update()方法;如果传入的是持久化对象,就直接返回。
满足下列任何一个条件,Hibernate就会认为该对象时临时对象:
A、Java对象的OID为null。
B、Java对象具有version版本控制属性并且取值为null(不明白)。
C、在映射文件中为<id>元素设置了unsaved-value属性,并且Java对象的OID与这个属性值匹配。
D、在配置文件中为version版本控制属性设置了unsaved-value属性,并且Java对象的version版本控制属性的取值与该属性值匹配。
E、为Hibernate的Interceptor提供了自定义的实现,并且Interceptor实现类的isUnsaved()方法返回Boolean.TRUE。
5、Session的merger()方法:
merge()方法能够把一个游离对象的属性复制到一个持久化对象中。
6、Session的delete()方法:
delete()方法用于从数据库中删除一个Java对象。既可以删除持久化对象,也可以删除游离对象。
7、Session的replicate()对象:
该方法能够把一个数据库中的对象复制到另一个数据库中。(暂不关注)
八、级联操作对象图:
1、cascade属性表:
(声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。)
攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)的更多相关文章
- 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务
一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...
- 攻城狮在路上(壹) Hibernate(七)--- 通过Hibernate操纵对象(下)
一.与触发器协同工作: 当Hibernate与数据库的触发器协同工作时,会出现以下两类问题: 1.触发器使Session缓存中的数据和数据库中的不一致: 出现此问题的原因是触发器运行在数据库内,它执行 ...
- 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...
- 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型
Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...
- 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序
1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略
本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...
- 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合
一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...
随机推荐
- php之CI框架多语言的用法
public function index() { // 加载语言包,可以加载多个 $this->lang->load('email'); echo $this->lang-> ...
- django 的模板语言
1.模版的执行 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. def current_datetime(req ...
- svn: E155004 'XX' is already locked
Error:svn: E155004: Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)svn: E155 ...
- PHP模拟登录并获取数据
cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...
- AngularJS vs. jQuery
很多Web开发新手都会有这样的疑问“我应该使用什么开发框架呢,如何快速学会Web开发呢?”这个问题其实没有一个统一的正确答案,其中讨论最多的就是AngularJS和jQuery的差别.这两者的之间的比 ...
- poj 2240(floyd)
http://poj.org/problem?id=2240 题意:有些人会利用货币的不用汇率来进行套现,比如1美元换0.5英镑,而1英镑又可以换10法郎,而1法郎又可以换0.21的美元,那么经过货币 ...
- PHP中文字符串编码转换
2016年2月26日 16:47:13 星期五 情景: PHP从csv导入数据时乱码 $name = mb_convert_encoding($name, 'UTF-8', 'ASCII,GBK,GB ...
- Kafka集群环境搭建
Kafka是一个分布式.可分区.可复制的消息系统.Kafka将消息以topic为单位进行归纳:Kafka发布消息的程序称为producer,也叫生产者:Kafka预订topics并消费消息的程序称为c ...
- Android开发者必备的42个链接
http://mobile.51cto.com/ahot-426035.htm Android开发者必备的42个链接 下面收集了42个帮助大家学习Android的内容链接,部分内容是面向初学者的,帮助 ...
- log4net使用
平时项目里一直都有在使用log4net作为日志记录模块,当时一直都没有去理解log4net的配置文件信息.今天抽出了一点时间来看了看配置文件信息. log4net配置文件信息: <log4net ...