SessionFactory的缓存可分为两类:内置缓存和外置缓存。SessionFactory的内置缓存中存
放了Hibernate配置信息和映射元数据信息等;SessionFactory的外置缓存是一个可配置的缓
存插件,在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存能存放大量数据
库数据的拷贝,外置缓存的物理介质可以是内存或者硬盘。本书第13章(管理Hibernate的缓
存)对此做了详细介绍。
Hibernate的许多类和接口都支持方法链编程风格,Configuration类的addClass()方法返回当
前Configuration实例,因此对于以下代码:
Configuration config = new Configuration();
config.addClass(Customer.class);
sessionFactory = config.buildSessionFactory();
如果使用方法链编程风格,可以改写为:
sessionFactory = new Configuration()
.buildSessionFactory()
.addClass(Customer.class)
.buildSessionFactory();
方法链编程风格能使应用程序代码更加简捷。在使用这种编程风格时,最好把每个调用方法
放在不同的行,否则在跟踪程序时,无法跳入每个调用方法中。
2.5.2 访问Hibernate的Session接口
初始化过程结束后,就可以调用SessionFactory实例的openSession()方法来获得Session实
例,然后通过它执行访问数据库的操作。Session接口提供了操纵数据库的各种方法,如:
save()方法:把Java对象保存数据库中。
update()方法:更新数据库中的Java对象。
delete()方法:把Java对象从数据库中删除。
load()方法:从数据库中加载Java对象。
find()方法:从数据库中查询Java对象。
Session是一个轻量级对象。通常将每一个Session实例和一个数据库事务绑定,也就是说,
每执行一个数据库事务,都应该先创建一个新的Session实例。如果事务执行中出现异常,应
该撤销事务。不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放
Session实例占用的资源。以下代码演示了用Session来执行事务的流程,其中Transaction类
用来控制事务。
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();
}
图2-6为正常执行数据库事务(即没有发生异常)的时序图。