演示对象的生命周期及Session接口

来源:互联网 发布:沥青路面设计软件 编辑:程序博客网 时间:2024/06/05 19:11
一、hibernate中对象根据其状态可以划分如下:
1、    瞬时对象(Transient Objects,临时对象):使用new 语句创建,还没有被持久化,不处于Session的缓存中。也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,它们的状态将会丢失,并由垃圾回收机制回收。
2、    持久化对象(Persistent Objects):已经被持久化,加入到Session缓存中。持久实例是任何具有数据库标识的实例,它由持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
3、    游离对象(Detached Objects,离线对象):已经被持久化,但不再处于Session的缓存中。Session关闭后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受hibernate管理。

二、Session接口:
    是Hibernate向应用程序提供的操纵数据的最主要接口,它提供了基本的保存、更新、删除和查询方法。
    Session具有一个缓存,位于缓存中的对象处于持久化状态,这和数据库的相关记录对应,Session能够
    在某些时间点,按照缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为“清理缓存”。
1、Session缓存的作用:
    1)减少访问数据库的操作。
    2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了改变,Session
        并不会立即执行相关的SQL语句,这使得Session可以把几条相关的SQL语句合并为一条SQL语句,以便
        减少访问数据库的次数,从而提高应用程序的性能。
    3)当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由
        死循环引起的JVM堆栈溢出异常。
       
2、在默认情况下,Session会在下面的时间点清理缓存:
    1)当应用程序调用Transaction的commit()方法时,commit()方法先清理缓存,然后再向数据库提交事务;
    2)当应用程序调用Session的find()或者iterate()方法时,如果缓存中持久化对象的属性发生了变化,就
        会先清理缓存,以保证查询结果能反映持久化对象的最新状态;
    3)当应用程序显式调用Session的flush()方法时;
    注:Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列SQL语句,但
        不会提交事务;commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新
        被永久保存下来。
       
3、查询数据:
    使用get()和load()方法,两者的区别:
    1)get()方法不支持延迟加载,load()方法支持延迟加载;
    2)如果没有查询到匹配数据,get()方法会返回null值,而load()方法会抛出ObjectNotFoundException异常;

4、插入数据:save(Object)方法
    使一个临时对象转变为持久化对象,save()方法完成以下操作:
    1)把临时对象加入到缓存中,使它变为持久化对象;
    2)选用映射文件指定的标识符生成器为持久化对象分配惟一的OID;
    3)计划执行一个insert语句,把临时对象当前的属性值组装到insert语句中;
    4)注意:save()方法并不立即执行SQL insert语句,只有当Session清理缓存时,才会执行SQL语句。
        如果在save()方法之后,又修改了持久化对象的属性,这会使得Session在清理缓存时,额外执行
        SQL update语句。
    5)Hibernate通过持久化对象的OID来维持它与数据库相关记录的对应关系。当对象处于持久化状态时,
        不允许程序随意修改它的OID,否则会导致Session清理缓存时抛出异常。
    6)提示:无论Java对象处理临时状态、持久化状态还是游离状态,应用程序都不应该修改它的OID。因此
        比较安全的做法是:在定义持久化类时,把它的setId()方法设为private类型,禁止外部程序访问
        该方法。

5、更新数据:update(Object)方法
    使一个游离对象转变为持久化对象,update()方法完成以下操作:
    1)把游离对象重新加入到Session缓存中,使它变为持久化对象;
    2)计划执行一个update语句。Session只有在清理缓存时才会执行update语句;
    3)只要通过update()方法使游离对象被一个Session关联,即使没有修改对象的任何属性,Session在清理
        缓存时也会执行由update()方法计划的update语句。
    4)当update()方法关联一个游离对象时,如果在Session缓存中已经存在相同OID的持久化对象,会抛出异常;
    5)当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常;

6、删除数据:delete(Object)方法
    从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句;
    如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete
    语句。    

三、Query接口:
    是HQL(hibernate query language)查询接口。
1、通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数;
2、动态绑定参数:Query接口提供了给各种命名参数赋值的方法;
3、调用Query接口的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象;
0 0
原创粉丝点击