码迷,mamicode.com
首页 > Web开发 > 详细

06Hibernate实体类生命周期

时间:2015-02-12 21:25:25      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

    前言: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级联操作实体类








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




06Hibernate实体类生命周期

标签:

原文地址:http://www.cnblogs.com/LiZhiW/p/4288898.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!