06Hibernate实体类生命周期

    前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存。站在持久化层的角度,Hibernate把实体类分为4种状态:持久化状态、临时状态、游离状态和删除状态。本文将会介绍Hibernate这些机制的细节以及使用方法。

1.Hibernate的Session缓存

(1)Session缓存的作用
    使用Session的缓存有三大作用:
    1. 减少访问数据库的频率,当Session的get()方法试图从数据库中加载一个对象时,Session先判断缓存中是否存在这个对象,如果存在就不需要再从数据库中检索,而直接从缓存中获取这个对象。
    2. 当缓存中的持久化对象之间存在循环关系是,Session会保证不会出现访问对象图的死循环,以及由循环引起的JVM堆栈溢出异常。
    3. Session能保证数据库中的相关记录与缓存中相应的对象保持同步。Session在清理缓存的时候会自动进行脏检查,如果发现Session缓存中的对象与数据库中的相应的记录不一致,就会根据对象的最新属性去同步更新数据库。
(2)Hibernate的脏检查和清理Session缓存原理
    当Session缓存中的对象的属性发生变化时,Session并不会立即清理缓存及执行相关的SQL update语句,而是在特定的时间点才清理缓存,这使得Session能把几条相关的SQL语句合并成一条SQL语句,以便减少访问数据库的次数。
    Session在清理缓存时,会按照以下顺序执行SQL:先insert,再update,最后delete。具体如下:
    1. 按照应用程序调用session.save()方法的先后顺序,执行所有对实体类进行插入的insert语句。
    2. 执行所有对实体类进行更新的update语句。
    3. 执行所有对实体类集合进行删除的delete语句。
    4. 执行所有对实体类集合进行删除、更新或者插入的SQL语句。
    5. 执行所有对实体类集合进行插入的insert语句。
    6. 按照应用程序调用session.delete()方法的先后顺序,执行所有对实体类进行删除的delete语句。
    在默认情况下,Session以下情况下清理缓存:
    1. 当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法先清理缓存,再提交事务。
    2. 当应用程序调用Hibernate执行查询时,如果缓存中的对象与数据库中的不一致(即缓存中的对象已发生变化),Hibernate就会先清理缓存再执行查询,以保证查询得到正确的数据。
    3. 当应用程序显式调用Session的flush()方法时。
    注意:Session清理缓存的例外情况是,如果对象使用native生成OID,那么当调用Session的save()方法时,会立即执行insert语句,以确保立即从数据库中得到对象的OID。
    如果不希望Session在以上默认的时间点清理缓存,也可以通过调用session.setFlushMode(flushMode)方法设置清理缓存的模式。具体模式如下:
        清理缓存的模式           查询    commit()方法  flush()方法
        FlushMode.AUTO         清理       清理          清理
        FlushMode.COMMIT       不清理     清理          清理
        FlushMode.NEVER        不清理     不清理        清理
    注意:Session的commit()方法与flush()方法的区别,它们都会清理缓存,但是commit()会提交事务。

2.实体类在Hibernate容器中的状态

(1)Hibernate实体类的三种状态
    站在持久化的角度,一个Java实体类的生命周期可以有四种状态,如下:
    1. 临时状态(transient):刚用new语句创建,还未被持久化的并且不在Session的缓存中的实体类。
    2. 持久化状态(persistent):已被持久化,并且在Session缓存中的实体类。
    3. 删除状态(removed):不在Session缓存中,而且Session已计划将其从数据库中删除的实体类。
    4. 游离状态(detached):已被持久化,但不再处于Session的缓存中的实体类。
    实体类的状态是可以变化的,它的变化过程如下图:
        技术分享  
(2)实体类生命周期状态的特征
    临时状态实体类的特点:
    1. 在使用代理主键的情况下,OID为null。
    2. 不在Session缓存中。
    3. 在数据库中没有对应的记录。
    持久化状态实体类的特点:
    1. OID不为null。
    2. 在Session缓存中
    3. 数据库中有对应的记录。
    删除状态实体类的特点:
    1. OID不为null。
    2. 不在Session缓存中。
    3. Session计划将其从数据库中删除。
    4. Session在清理缓存时,会执行相应的delete语句。
    游离状态实体类的特点:
    1. OID不为null。
    2. 不在Session缓存中。
    3. 数据库中有对应的记录。

3.Session接口的详细用法

    Session接口是Hibernate向应用程序提供操作数据库的最主要的接口,本小节就讲解它的主要使用的方法。
(1)创建Session的过程



(2)Session的save()和persist()方法




(3)Session的get()和load()方法




(4)Session的update()和saveOrUpdate()方法



(5)Session的merge()方法



(6)Session的delete()方法




(7)Session的replicate()方法



4.Hibernate级联操作实体类








-------------------------------------------------------------------------------------------------------------------------------




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。