Hibernate 的持久层访问必须按如下步骤进行:
( 1 )创建 Configuration 实例
( 2 )创建 SessionFactory 实例
( 3 )创建 Session 实例
( 4 )打开事务
( 5 )开始持久化访问
( 6 )提交事务
( 7 )如果遇到异常,回滚事务
( 8 )关闭 Session
在 HQL 查询一节,已经采用 HibernateUtils 工具类封装部分过程。但依然不够简洁,需要通过代码显式地打开 Session ,显式地开始事务,然后关闭事务,关闭 Session 。而 Hibernate 提供更简单的方式操作持久层,无须显式地打开 Session ,无须在代码中执行任何的事务操作语句。
对 Hibernate 的简化,还基于 Spring 对异常处理的简化。底层数据库异常几乎都不可恢复,强制处理底层数据库几乎没有任何意义,但传统 JDBC 数据库访问的异常都是 checked 异常,必须使用 try...catch 块处理。
Spring 包装了 Hibernate 异常,转换到 DataAccessException 继承树内,所有 DataAccessException 全部是 runtime 异常,并不强制捕捉。归纳起来, Spring 对 Hibernate 的简化主要有如下几个方面:
q 基于依赖注入的 SessionFactory 管理机制。 SessionFactory 是执行持久化操作的核心组件。传统 Hibernate 应用中, SessionFactory 必须手动创建;通过依赖注入,代码无须关心 SessionFactory , SessionFactory 的创建,维护由 BeanFactory 负责管理。
q 更优秀的 Session 管理机制。 Spring 提供“每事务一次 Session ”的机制,该机制能大大提高系统性能,而且 Spring 对 Session 的管理是透明的,无须在代码中操作 Session 。
q 统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须繁琐的开始事务,显式提交、回滚。如果使用声明式事务管理,事务管理逻辑与代码分离,事务可在全局事务和局部事务之间切换。
q 统一的异常处理机制。不再强制开发者在持久层捕捉异常,持久层异常被包装成 DataAccessException 异常的子类,开发者可以自己决定在合适的层处理异常,将底层数据库异常包装成业务异常。
q HibernateTemplate 支持类。 HibernateTempate 能完成大量 Hibernate 持久层操作,这些操作大多只需一行代码,非常简洁。