Hibernate学习笔记
1、Hibernate核心类与接口
1-1.Configuration类
Configuration类是Hibernate的入口,它负责配置和启动Hibernate,Hibernate框架通过Configuration实例加载配置文件信息(hibernate.cfg.xml),然后读取指定对象关系映射文件(bean.hbm.xml)的内容并创建SessionFactory.
1-2.SessionFactory接口
SessionFactory接口负责初始化Hibernate,一个SessionFactory实例对应一个数据存储源(一般就是指一个数据库)。应用程序从SessionFactory中获得Session实例。SessionFactory具有以下特点:
1) 线程安全,即同一个 SessionFactory实例可以被应用 的多个线程共享。
2) 它是重量级的 ,因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等。
所以说 ,如果一个应用程序中只访问一个数据库 ,则只需要创建一个全局的 SessionFactory实例。
1-3.Session 接口
Session是Hibernate中应用最频繁的接口。Session也被称为持久化管理器 ,它负责管理所有与持久化相关的操作:如存储、更新、删除和加载对象等。Session接口具有以下特点:
1) 单线程,非共享的对象。线程不安全,在设计软件架构时候,应该避免多个线程共享同一个session实例。
2) Session 实例是轻量级的,它的创建和销毁不需要消耗太多的资源。可以为每个请分配一个Session实例,在每次请求过程汇总及时创建和销毁 Session实例。
3) Session有一个缓存,它存放当前工作单元加载的对象。Session的缓存被称为Hibernate的一级缓存。
1-4.Transaction接口
Transaction接口是 Hibernate框架的事务接口。它对底层的事务接口做了封装,包括:JDBC API和JTA.这样使得Hibernate应用可以通过一致的Transaction接口来申明事务边界,这有助于应用程序再不同的环境和容器中移植。
1-5.Query和Criteria接口
它们是 Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程。Query包装了一个 HQL(Hibernate Query Language);而Criteria接口完全封装了基本字符串形式的查询语句,比Query更加面向对象,Criteria接口擅长于执行动态查询。
2、Hibernate中常用的事务隔离级别
常量
|
值
|
说明
|
TRANSACTION_NONE
|
0
|
不支持事务
|
TRANSACTION_READ_UNCOMMITTED
|
1
|
指示可以发生脏读(dirty read)、不可重复读和虚读(phantom read)的常量。此级别允许被某一事务更改的行在已提交该行所有更改之前被另一个事务读取(“脏读”)。如果所有更改都被回滚,则第二个事务将获取无效的行。
|
TRANSACTION_READ_COMMITTED
|
2
|
指示不可以发生脏读的常量;不可重复读和虚读可以发生。此级别只禁止事务读取其中带有未提交更改的行。
|
TRANSACTION_REPEATABLE_READ
|
4
|
指示不可以发生脏读和不可重复读的常量;虚读可以发生。此级别禁止事务读取带有未提交更改的行,它还禁止这种情况:一个事务读取某一行,而另一个事务更改该行,第一个事务重新读取该行,并在第二次读取时获得不同的值(“不可重复读”)。
|
TRANSACTION_SERIALIZABLE
|
8
|
指示不可以发生脏读、不可重复读和虚读的常量。此级别包括TRANSACTION_REPEATABLE_READ 中禁止的事项,同时还禁止出现这种情况:某一事务读取所有满足 WHERE 条件的行,另一个事务插入一个满足 WHERE 条件的行,第一个事务重新读取满足相同条件的行,并在第二次读取时获得额外的“虚”行。
|
3、Hibernate中实例的状态
3-1:临时状态
该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键值),临时状态下的对象有如下特征。
1) 不处于Session缓存中,也可以说不被任何一个Session关联
2) 在数据库中没有对应的记录
在以下情况下,Java对象进入临时状态
1) 当通过new语句刚创建一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
2) Session的delete()方法能使一个持久化或临时脱管对象转换为临时对象。对于脱管对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session缓存中删除。
3-2:持久化状态
该实例目前与某个持久化上下文有关联,它拥有持久化标识(相当于主键值),并且可能在数据库汇总有一个对应的行。对于某一个特定的持久化上下文,Hibernate保证标识与Java标识(其值代表对应在内存中的位置)等价。持久化对象有以下特征。
1) 位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
2) 持久化对象和数据库中的相关记录对应。
3) Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。
Session的许多方法都能够触发Java对象进入持久化状态。
4) Session的save()的方法能够把临时对象转变成持久化对象。
5) Session的load()或get()方法返回的对象总是处于持久化状态。
6) Query类的list()方法返回的list集合中存放的都是持久化对象。
7) Session的update()、saveOrUpdate()和lock()方法使脱管对象转变为持久化对象。
当一个持久化对象关联一个临时对象时,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变成持久化对象。Hibernate保证在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象,也就是说在一个Session里load/get同一个OID得到 的是相同的对象。
3-3:脱管状态
实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了,或者这个实例是被序列化(serialize)到另外的进程。它拥有持久化标识,并且在数据库中可能存在一个对应的行。对于脱管状态的实例,Hibernate不保证任何持久化标识和Java标识的关系。
脱管对象具有以下特征。
1) 不再位于Session的缓存中,也可以说,脱管对象不被Session关联。
2) 脱管对象是有持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。
3) 脱管对象与临时对象的相同指出在于两者都不被Session关联,因此Hibernate不会保证他们属性变化与数据库保持同步。脱管对象与临时对象的区别在于前者是由持久化对象转变过来的,因此可能在书库中还存在对应的记录,而后者在数据库中是没有对应的记录的。
Session的以下方法使持久化对象转变成脱管对象.
1) 当调用Session的close()方法时,Session 的缓存被清空,缓存中的所有持久化对象都变为脱管对象,如果在应用程序中没有引用变量引用这些脱管对象,他们就会结束生命周期。
2) Session的evict()方法能够从缓存中删除一个持久化对象,使它变为脱管状态,当Session的缓存中保存了大量的持久化对象时,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。但是多数情况下不推荐使用该方法,而应该通过查询语言,或者显示的导航来控制对象图的深度。
posted on 2010-01-09 19:08
absolute 阅读(659)
评论(0) 编辑 收藏 所属分类:
OpenSource