一、Configuration类
Configuration类位于org.hibernate.cfg.Configuration下。Configuration对象用于配置并且启动Hibernate。Hibernate应用通过Configuration实例来指定对象-关系映射关系的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。
获得Configuration类的一个实例的方法:
1 new Configuration().configure()
当执行Configuration conf = new Configuration().configure()语句时,Hibernate会自动在classpath中搜寻Hibernate配置文件。在JAVA应用中,Hibernate会自动在WEB-INF/classes目录下搜寻Hibernate配置文件。
configure()方法在默认情况下通过访问hibernate.cfg.xml的<mapping>元素来加载程序员提供的.hbm.xml文件。可以同过下面方法指定.hbm.xml文件:
addClass(Class): 直接通过指定Class来加载对应的映射文件。
addFile(File)
addFile(String)
addURL(URL)
2 HibernateSessionFactory.getConfiguration();
Configuration conf =ibernateSessionFactory.getConfiguration();
从当前HibernateSessionFactory的中得到。
二、SessionFactory接口
SessionFactory负责Session实例的创建。可以通过Configuration实例构建:
一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:
1 它是线程安全的,这意味着它的同一个实例可以被应用程序的多个线程共享。
2 它是重量级的,这就意味着不能随意创建或销毁它的实例。
示例:
Configuration cfg = new Configuration().configurate();
SessionFactory sf = cfg.buildSessionFaction();
Configuration对象根据当前的配置信息,生成SessionFactory对象。
SessionFactory一旦被创建,就被赋予特定的配置信息。即以后配置的改变不会影响到创建的SessionFactory对象。
如果要把改动后的配置信息赋予SessionFactory对象,需要从新的Configuration对象生成新的SessionFactory对象。
注:SessionFactory是线程安全的,可以被多线程调用以取得Session,而且构造SessionFactory很消耗资源,所以大多数情况下一个应用只初始化一个SessionFactory,为不同的线程提供Session。
当客户端发送一个请求线程时,SessionFactory生成一个Session对象处理客户请求。
三、Session接口
Session接口是Hibernate应用使用最广泛的接口。Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。
Session有以下特点:
1 不是线程安全的,因此在设计软件架构时,应避免多个线程共享一个Session实例。
2 Session是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多的资源。
Session对象通过SessionFactory构建:
Session session = SessionFactory.openSession();
对持久化类的理解:
一个持久化类从定义上和一个普通的JavaBean类没有任何区别,但它与Session关联起来,就具有了持久化的能力。
这种持久化操作是受Session控制的,即通过Session对象装载、保存、创建、或查询持久化对象PO。
Session类的主要方法:
1 建立查询对象
createQuery()方法:用来从Session生成Query对象。
beginTransaction()方法:用来从Session生成Transaction对象。
2管理Session的方法:
isOpen(),flush(),clear(),evict()和close()等方法。
2 获取持久化对象:get()和load()方法.
get()方法
public object get(Class entityClass,Serializable id)
entityClass 表明类的类型,id是对象的主键值,如果id是int类型,应通过new Integer(id)的方法把它变成一个Integer对象。
load()方法
public object load(Class entityClass,Serializable id)
load()方法和get()方法都能通过主键id值从数据库中加载一个持久化对象PO。
两者的主要区别:当数据库中不存在主键id值,load()方法会抛出org.hibernate.ObjectNotFoundExceptio,get()方法则抛出java.lang.NullPointerException。
3 持久化对象的保存、更新、和删除:
save(),update(),saveOrUpdate()和delete()等方法。
理解Sesion的缓存
在Session接口的实现类org.hibernate.impl.SessionImpl中定义了一系列的Java集合,这些Java集合构成了Session的缓存。
Session缓存的三大作用
1 减少访问数据库的频率。
2 保证缓存中的对象与数据库中的相关记录可以保持同步。
3 当缓存中的持久化对象存在循环关系时,Session会保证不出现访问对象的死循环,以及由死循环引起的JVM堆栈溢出异常。
注意:Session的commit()和flush()方法的区别:
flush():清理缓存并执行一系列SQL语句,不提交事务。
commit():会先调用flush()方法,然后提交事务。提交事务意味着数据所做的更新被永久保存下来。
Hibernate应用中Java对象的状态
对于需要持久化的Java对象,在它的生命周期中,可处于以下三种状态:
1 临时状态(transient):刚刚被new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
2 持久化状态(persistent):已被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。
3 游离状态(detached):已被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
四、Query和Criteria接口
Query和Criteria接口是Hibernate的查询接口,用于向数据库查询对象,以有控制执行查询的过程。
Query实例包装了一个HQL(Hibernate Query Language)查询语句,HQL和SQL查询语句有些相似,便HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象。Criteria接口擅长于执行动态查询。
复杂查询用QBC检索方式。QBC检索方式主要由Criteria接口、Criterion接口和Expression、Restrictions类组成。
五、Transaction接口
Transaction接口是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括:
JDBC API
JTA (Java Transaction API)
CORBA (Common Object Requet Broker Architecture) API
Hibernate应用可通过一致的Transaction接口来声明事务边界,这有助于在不同的环境或容器中移植。