您的位置:首页 > 其它

Hibernate 学习笔记第二篇

2010-12-17 11:57 162 查看
Hibernate 的核心类和接口

1> Configuration 类:

Configruation类是Hibernate 的入口,它负责配置并启动Hibernate。Hibernate 框架通过Configuration

实例加载配置文件信息,然后读取指定对象关系映射文件内容并创建SessionFactory实例。

2> SessionFactory 接口:

SessionFactory 接口负责初始化Hibernate, 一个SessionFactory 实例对应一个数据库存储源(一般指一个数据库),

应用程序从SessionFactory 中获取Session实例,SessionFactory 有以下特点。

2.1> 线程安全,同一个SessionFactory 实例可以被多个线程共享。

2.2> 它是重量级的,因为它需要一个很大的缓存,用来存储预定的SQL语句和映射元数据。

注:如果一个应用程序只访问一个数据库只需要创建一个SessionFacory。

3> Session接口:

Session 是hibernate 应用中使用最为频繁的接口之一,Session被称为执久化管理器,负责所有的执久化工作。

如:存储,更新,删除,加载对象等。Session有以下特点:

3.1> 单线程:非共享对象。线程不安全,在设计软件架构时,应避免多个线程共享一个Session。

3.2> session是轻量级的,它的创建和销毁不需要消耗太多的资源,可以给每个请求配置一个Session,

在每次请求过程中及时的创建和销毁Session实例。

3.3> session 有一个缓存,它存入了当前工作单元加载过的对象,session缓存被称为Hibernate的一级缓存。

4> Transaction 接口:

Transaction接口是负责hibernate事务的,它对底层的事务接口做了封装,包括JDBC JTA,这样有利于一致的transaction

接口来声明事务的边界。

5> Query 和Criteria 接口

它们是Hibernate 查询接口,用于从数据库存储源查询对象及控制查询过程。

Query 包装了一个HQL(Hibernate Query language)。

整体执行过程:

Configuration config = new Configuration().configure("hibernate.cfg.xml");

SessionFactory sessionFacory = config.bulidSessionFacory();

Session session = sessionFactory.openSession();

Transaction transaction = session.beginTransaction();

transaction.begin();

session.save(Object);

transaction.commit()

transaction.close();

session.close();

sessionFacory.close();

启动hibernate-->创建SessionFactory-->开启Session-->开启Transaction-->执行执久化操作-->关闭Transaction-->关闭Session-->关闭SessionFactory。

执久化对象的生命周期:

一个执久化类的实例,在持久化生命周期中会在不同的状态间转变,Hibernate 定义了四种状态。

瞬时状态(transient)

实例是通过new 语句创建的的,没有与session关联,与数据库中没有对应的标识,如果超出作用范围将被垃圾回收。

持久状态(persistent)

实例己经被持久化,与session关联,且session没有关闭,在数据库中有对应的标识。

移除状态(removed)

如果有一个对象已经计划在一个session 上下文结束时删除,它就处于删除状态,仍然处于session的管理中,直到工作单元结束,同步到数据库,删除对应标识。

脱管状态(detached)

实例不在session 的管理范围内,数据库有对应的标识。

结构图如下:



Session的基本操作:

Session是Hibernate 中一个重要的持久化管理器,用它完成对对象的CRUD操作、持行查询、事务操作,Session执行持久化操作时,都声明可能会的抛出的异常。

HibernateException可以处理也可不去理会,所以HibernateException 是一个非受检异常。

Session方法介绍:

public Serializable save(Object obj) throws HibernateException;持久化给定的瞬时实体,并返回该实例的对象标识符值。

当调用save()方法时,完成以下步骤:

1> 把瞬时对应加入到当前Session的缓存中,它便是持久化对应了。

2> 使用主键生成策略为此持久化对象分本唯一的OID.

3> 计划执行insert 语句,把该持久化对象保存到数据库,只有清除当前Session时才会执行insert语句,

如果在清除当前Session时修改了持久化对象,那么Session清除缓存时会额外的持行一条SQL update语句。

public Object get(Class clazz,Serializable OID) throws HibernateException;根据给定的OID返回持久化对象。

get() 方法会查询当前Session中是否存该对应,如果存在就返回,不存在去二级缓存中查找,如果二级缓存还是不存中就会去数据库中查找,

如果数据库不存就返回null。

public Object load(Class clazz,Serializable OID) throws HibernateException; 根据IOD返回执久化对象。

load()方法会查询当前Session中是否存该对应,如果存在就返回,不存在去二级缓存中查找,如果存在就返回,如果还是不存在,hibernate

框架就会创建一个代理对象返回,这个代理对象只包含一个标识符,其他的属性为空。所谓的懒加载。(查询实体类没有定义成final 否则不会有懒加载),

直到必须使用此对象时才会到数据库中查询。如果数据库不存就会抛出异常 ObjectNotFoundException。

说明:产生代码对象的说明:

在hibernate 3.2版本前使用的是cglib,而hibernate 3.3后就换成了javassist 。本例使用hibernate3.3

如下图所示:



如果需要手机的更改成cglib 则需要在hibernate.properties中添加

hibernate.bytecode.provider=cglib

用来指定字节码处理机制

如下图所示:



public void delete(Object object) throws HibernateException; 把指定的执久化实例转换顾瞬时状态,并从数据表中移除对应的记录。

public void update(Object obj) throws HibernateException;把脱管对象加入到当前session中,并把它执久化到数据库中。

public Oject merge(Object ojb) throws HibernateException;将对象的实例的状态复制到具有相同标识的执久化实例上,并返回这个执久化对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: