您的位置:首页 > 其它

Hibernate 开发步骤(初学Hibernate3.2.0)

2013-05-09 09:03 204 查看
一、Hibernate 开发步骤(以Hibernate3.2.0为例):

1、Hibernate是开源的,下载Hibernate的源代码包,里面包括所有的jar包和文档。

2、添加Hibernate包:hibernate3.jar和lib下的Hibernate依赖包(大约一共39个)。

3、编写domain类:一些属性和get、set方法。

4、编写映射文件.hbm.xml:把java对象和关系模型对应起来。

5、编写配置文件 hibernate.cfg.xml:用于配置Hibernate,初始化时首先读取此配置文件。

6、编写测试类进行测试。

二、

Hibernate的初始化

(1)创建一个Configuration类的实例,Configuration类的构造方法把默认文件路径下的hibernate.properties配置文件中的配置信息读入到内存:

Configuration config = new Configuration();

(2)调用Configuration类的addClass(Customer.class)方法:

config.addClass(Customer.class);

该方法把默认文件路径下的Customer.hbm.xml文件中的映射信息读入到内存中。

(3)调用Configuration类的buildSessionFactory()方法:

sessionFactory = config.buildSessionFactory();

SessionFactory接口

一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:

它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。

它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。

Session接口

Session接口是Hibernate应用使用最广泛的接口。

Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。

Session有以下特点:

不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。

Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。

Session接口操纵数据库的方法

Session接口提供了操纵数据库的各种方法,如:

save()方法:把Java对象保存数据库中。

update()方法:更新数据库中的Java对象。

delete()方法:把Java对象从数据库中删除。

load()方法:从数据库中加载Java对象。

Query()方法:从数据库中查询Java对象。

用Session来执行事务的流程

Session session = factory.openSession();

Transaction tx;

try {

//开始一个事务

tx = session.beginTransaction();

//执行事务

...

//提交事务

tx.commit();

}

catch (Exception e) {

//如果出现异常,就撤销事务

if (tx!=null) tx.rollback();

throw e;

}

finally {

//不管事务执行成功与否,最后都关闭Session

session.close();

}

正常执行数据库事务的流程

saveCustomer()方法

该方法调用Session的save()方法,把Customer对象持久化到数据库中。

tx = session.beginTransaction();

session.save(customer);

tx.commit();

当运行session.save()方法时,Hibernate执行以下SQL语句:

insert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX,

IS_MARRIED,DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME)

values(1,'Tom','tom@yahoo.com','1234',55556666,'Shanghai','M',0,'I am very honest.', ?,'1980-05-06',null)

在test()方法中并没有设置Customer对象的id属性,Hibernate会根据映射文件的配置,采用increment标识符生成器自动以递增的方式为OID赋值。在Customer.hbm.xml文件中相关的映射代码如下:

<id column="ID" type="long">

<generator />

</id>

loadAndUpdateCustomer ()方法

该方法调用Session的load()方法,加载Customer对象,然后再修改Customer对象的属性。

tx = session.beginTransaction();

Customer c=(Customer)session.load(Customer.class,customer_id);

c.setAddress(address);

tx.commit();

以上代码先调用Session的load()方法,它按照参数指定的OID从数据库中检索出匹配的Customer对象,Hibernate会执行以下SQL语句:

select * from CUSTOMERS where update CUSTOMERS set ,EMAIL="Tom@yahoo.com"…ADDRESS="Beijing"…

where void printCustomer(Customer customer)throws Exception{

byte[] buffer=customer.getImage();

FileOutputStream fout=new FileOutputStream("photo_copy.gif");

fout.write(buffer);

fout.close();

System.out.println("------以下是"+customer.getName()+"的个人信息------");

System.out.println("ID: "+customer.getId());

System.out.println("口令: "+customer.getPassword());

System.out.println("E-Mail: "+customer.getEmail());

System.out.println("电话: "+customer.getPhone());

……

}

deleteAllCustomers()方法

该方法调用Session的delete()方法,删除所有的Customer对象:

tx = session.beginTransaction();

session.delete("from Customer as c");

tx.commit();

运行session.delete()方法时,Hibernate先执行select语句,查询CUSTOMERS表的所有Customer对象:

select * from CUSTOMERS;

接下来Hibernate根据Customer对象的OID,依次删除每个对象:

delete from CUSTOMERS where

4、save方法可以把临时状态的对象转换持久化对象

5、load和get方法返回的对象总是处于持久化状态

6、update或saveorupdate、lock方法是游离对象转换为持久化状态。

游离对象的特征

1、不位于Session缓存中,游离对象不被Session关联

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

3、游离对象和临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化和数据库保持同步。区别在于游离对象是由持久化对象转变过来的,在数据库中可能有对应的数据,而临时对象在数据库中没有与之对应的数据记录。

4、当调用Session的close方法时,Session的缓存被清空,缓存中所有的持久化对象都变成游离对象

=============================================以上内容是经自己整理完善=================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: