1.只要Session没有被清空,则存在Session缓存中的对象就不会清空即使没有变量来引用它。
2.Session的get()方法试图从数据库加载一个对象,Session先判断缓存中是否已经存在这个对象,如果有,就不需要进入数据库中检索,反之进入数据库检索。
3.Session缓存的作用:(1)减少访问数据库的频率。(2)当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象死循环,以及由死循环引起的JVM堆栈溢出异常。(3)保证数据库中的相关记录与缓存中的相应对象保持同步。
4.脏检查:当一个持久化对象被加入到Session缓存中时,Session会为该对象的值类型的属性复制一份快照,当Session清理缓存时,会先进行脏检查,即比较当前对象与它的快照,如果发生变化,则称这个对象为脏对象,Session会根据脏对象的最新属性来执行相关SQL语句,从而同步更新数据库。
5.默认情况下,Session会在以下时间点清理缓存:(1)当应用程序调用org.hibernate.Transaction的conmmit()方法时,conmmit()方法会先清理缓存再提交事务。(2)当应用程序执行一些查询操作时会先清理缓存,再执行查询语句。(3)当应用程序显式调用Session的flush()方法的时候。
6.可以通过Session的setFlushMode()方法来设置清理缓存的时间点,该方法有三种参数,即FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。
7.Session在清理缓存时,按照如下顺序执行SQL语句
(1)Session.save()
(2)执行所有对实体进行的update语句
(3)执行所有对集合进行的delete语句
(4)执行所有对集合元素进行删除、更新或者插入的SQL语句
(5)执行所有对集合进行插入的insert语句
(6)按照应用程序调用session.delete()方法先后顺序,执行对所有实体进行删除的delete语句
8.Java对象在hibernate持久化层的状态
临时状态、持久化状态、删除状态、游离状态
(1)临时状态,OID为null,不存在session缓存中,不被任何session实例相关联,数据库中没有相应记录。
(2)持久化状态,OID不为null,存在于session缓存中,和session实例相关联,数据库中有相应记录。Session的save()将临时对象转化为持久化对象,Session的load()和get()返回的对象总是处于持久化状态,Query的list()返回的集合中对象都是持久化状态,Session的update()、saveOrUpdate()和lock()方法使游离对象转变持久化对象。
(3)删除状态,OID不为null,从一个Session实例的缓存中删除,被删除对象和数据库中相应记录对应,Session已计划将其从数据库中删除,Session在清理缓存时,会执行相应的SQL delete语句,原则上不应该继续使用被删除对象的引用。
(4)游离状态,OID不为null,不在Session缓存中,数据库中可能还存在相应记录。
9.Session可以使用以下方法使持久化对象变成游离对象:
(1)Session的close()方法,关闭Session,Session的缓存会被清空。
(2)Session的evict()方法能够从缓存中删除一个持久化对象。
(3)Session的clear()方法能够清空Session中所有持久化对象。
10.Session的save()方法完成以下操作:
(1)把对象加入Session缓存中,使它进入持久化状态。
(2)选用映射文件指定的标识符生成器为持久化对象分配唯一OID。
(3)计划执行一个insert语句,把对象当前属性值组装到insert语句中,在清理缓存的时候执行该语句。
11.Session的load()和get()方法区别,load()默认采用延迟检索策略,除非显式将lazy=false,它才采用立即检索,而get()无论lazy属性为何值,它都采用立即检索,还有一个区别就是当数据库中不存在与OID对应的记录时,load()抛出异常,而get()返回null。应适当根据实际情况选择使用load()和get(),加载一个持久化对象如果是为了访问它的属性,则用get(),如果是为了删除它,则用load()足矣。
12.Session的update()使游离对象转化为持久化对象,并且计划执行一个update语句,只有当Session清理缓存时,执行update()语句,并用当前对象最新属性来组装update语句,即使没有修改这个游离对象属性,最后也会执行一个update()语句,可以在<class>中配置select-before-update属性来设置只有该对象属性有改变时才执行update语句,根据实际情况使用!因为用此种方式会在update前多执行一个select语句。
13.Session的saveOrUpdate()方法会根据传入对象状态来执行相应语句,如果是临时对象,则执行save(),如果是游离对象,则执行update()。如果满足以下情况之一,hibernate会将该对象视为临时对象:
(1)Java对象OID为null。
(2)在映射文件中<id>元素设置了unsaved-value属性,并且Java对象OID与此属性值匹配。
(3)Java对象具有version版本控制属性并且取值为null。
(4)在映射文件中为version版本控制属性设置了unsaved-value属性,并且Java对象的version版本控制属性的取值与映射文件中unsaved-value属性值匹配。
14.Session的merge()方法可以将一个游离对象属性复制到一个持久化对象中。
15.Session的delete()方法,可以将持久化对象和游离对象删除。
(1)如果传入参数为游离对象,先使游离对象被当前Session关联,使它变成持久化对象,如果传入的是持久化对象,则忽略这一步。
(2)计划执行一个delete语句。
(3)把对象从Session缓存中删除,该对象进入删除状态。
Session只有在清理缓存时候才会执行delete语句,原则上,删除对象是无用对象,程序不应该再使用这些对象。
15.通过HQL来进行批量操作,批量操作直接在数据库中完成,所处理的数据不会存在Session缓存中,因此不会占用空间。