Hibernate入门入门三

一、操纵持久化对象

1、理解Session的缓存:

      当Session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用customer对象,只要session的缓存没有被清空,customer对象仍然处于生命周期中。当session的load()方法试图从数据库中加载一个customer对象时,session先判断缓存中是否已经存在这个customer对象,如果存在,就不需要再到数据库中检索。

session缓存的作用:

①、减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此session的缓存可以提高数据访问的性能。

②、保证缓存中的对象与数据库中的相关记录保持同步。位于缓存中的对象被称为持久化对象,当缓存中持久化对象的状态发生了变化,session并不会立即执行相关的sql语句,这使得session能偶把几条相关的sql语句合并为一条sql语句,以便减少访问数据库的次数,从而提高应用程序的性能。

tx=session.benginTransaction();
Customer customer=(Customer)session.load(Customer.class);
customer.setName("Jack");
customer.setName("Mike");
tx.commit();

    当Session清理缓存时,只需执行一条update语句:update customers set name="mike" .... where id=1;

   当session加载了customer对象后,会为customer对象的值类型的属性复制一份快照。当sesion清理缓存时,通过比较customer对象的当前属性与他的快照,session能够判断customer对象的哪些属性发生了变化。

2、Session会在下面的时间点清理缓存:

①、当应用程序调用Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。

②、当应用程序调用session的find()或iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。

③、当应用程序显式调用sesion的flush()方法的时候。

如果对象使用native生成器来生成OID,那么当调用session的save()保存该对象时,会立即执行向数据库插入该实体的insert语句。

3、session的commit()和flush()方法的区别:flush()方法进行清理缓存的操作,执行一系列的sql语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。

4、session的setFlushMode()方法用于设定清理缓存的时间点,flushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.Commit和FlushMode.NEVER。Auto是默认值,是优先考虑的清理模式,它保证在整个事务中,数据保持一致。

5、Hibernate应用 中java对象的状态:

①、临时状态transient:刚刚用new语句创建,还没有被持久化,不处于session的缓存中。处于临时状态的java对象被称为临时对象。

②、持久化状态persistent:已经 被持久化,加入到session的缓存中,

③、游离状态detached:已经被持久化,但不再处于session的缓存中。

(1)、  临时对象的特征:

        不处于Session的缓存中,不被任何一个Session实例关联。在数据库中没有对应的记录。在以下情况下,java对象进入临时状态:

        ①、当通过new语句刚创建了一个java对象,它处于临时状态,此时不和数据库中的任何记录对应。

        ②、Session的delete()方法能使一个持久化对象或游离对象变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从session的缓存中删除。

(2)、持久化对象的特征:持久化对象具有以下特征:

       ①、位于一个session实例的缓存中,也可以说,持久化对象总是被一个session实例关联。

        ②、持久化对象和数据库中的相关记录对应。

       ③、session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。

        session的许多方法都能触发java对象进入持久化状态:

        ① 、session的save()方法把临时对象转变为持久化对象。

        ②、session的load()方法或get方法返回的对象总是处于持久化状态。

        ③、session的find()方法返回的List集合中存放的都是持久化对象。

        ④、session的update()、saveOrUpdate()和lock()方法时游离对象转变为持久化对象。

       ⑤、当一个持久化对象关联一个临时对象,在允许级联保存的情况下,session在清理缓存时会把这个临时对象也转变为持久化对象。


      Hibernate保证在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象。在应用程序中,应该避免一个java对象同时被多个sesion 实例关联,因为这样会导致重复执行sql语句,并且极易出现一些并发问题。

(3)、游离对象的特征:

       ①、不再位于session的缓存中,游离对象不能被session关联。

       ②、游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。

      游离对象与临时对象的相同之处在于,两者都不被session关联,因此HIbernate不会保证他们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:游离对象是有持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。

       session的以下方法使持久化对象转变为游离对象:

      ①、当调用session的close()方法时,session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,他们就结束生命周期。

      ②、session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。

二、Session的保存、更新、删除和查询方法

      Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和查询方法。

1、session的save()方法:

  将一个临时对象加入到缓存中,使它变为持久化对象。计划执行一个insert语句,把对象当前的属性组装到insert语句中。例如,

insert into customers(id,name...)value(1,'TOm')

save()方法并不立即执行sql  insert语句,只有当session清理缓存时,才会执行sql insert语句。如果在save()方法之后,又修改了持久化对象的属性,这会使得session在清理缓存时,额外执行sql update语句。

2、session的update()方法:

使一个游离对象转变为持久化对象。session只有在清理缓存的时候才会执行update语句。

如果希望session仅仅当修改了customer对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,该属性默认为false。

<class name="mypack.Customer" table="customer" select-before-update="true" >

当session清理缓存时,会先执行一条select语句:

select * from customers where id=1

然后比较customer对象的属性是否和从数据库中检索出来的记录一致,只有不一致的情况下,才执行update语句。

应该根据实际情况来决定是否应该把select-before-update设为true。如果java对象的属性不会经常变化,可以把select-before-update属性设为true,避免session执行不必要的update语句,这样会提高应用程序的性能。如果需要经常修改java对象的属性,就没必要吧这个属性设为true,因为它会导致在update语句之前,执行一条多余的select语句。

3、session的saveOrUpdate()方法:

saveOrUpdate()方法同时包含了save()和update()方法的功能,如果传入的参数是临时对象,就调用save()方法,如果传入的参数是游离对象,就调用update()方法;如果传入的参数是持久化对象,就直接返回。

4、session的load()和get()方法

Session的laod()和get()方法都能根据给定的OID从数据库中加载一个持久化对象,这两个方法的区别:当数据库中不存在与OID对应的记录时,load()方法抛出ObjectFoundException异常,而get()方法返回null。

5、session的delete()方法

delete()方法用于从数据库中删除与java对象对应的记录。如果传入的参数是持久化,session就计划执行 一个delete语句。如果传入的参数是游离对象,先使游离对象被session关联,使它变为持久化对象,然后计划执行一个delete语句。Session只有在清理缓存的时候才会执行delete语句,只有当调用session的close()方法时,才会从session的缓存中删除该对象。


你可能感兴趣的:(Hibernate入门入门三)