Spring 整合 Hibernate - XinxinZhou/JavaEE GitHub Wiki
Java EE很少直接用JDBC 的方式进行持久层访问。 因为用面向对象的设计语言来访问关系型数据库很麻烦。 大部分时候,javaEE都会以ORM框架来进行持久层访问。 在所有ORM框架中,Hibernate的特点是比较灵巧,有轻便的封装。 而Spring有良好的开放性,能与大部分ORM框架良好整合。 (ORM, Object-relational mapping, 对象关系映射, 是一种编程技术,用于转换互不兼容的系统之间的数据。) JDBC是Java访问数据库的技术,提供足够的API去完成需求,但是需要开发人员手动写很多代码,以及安全检查。 ORM是一种思想,封装了JDBC底层技术,可以从java代码映射到数据库,可以跟踪用户的操作,保证数据状态的统一。(两个用户修改同一个数据)
8.7.1 Spring 提供的 DAO 支持 DAO模式是一种标准的javaEE设计模式,DAO模式的核心思想是:所有的数据库访问,都通过DAO组建完成,DAO组建封装了数据库的增删改等原子操作。业务逻辑组件依赖于DAO组件提供的数据库原子操作,完成系统业务逻辑的实现。
JavaEE应用大致都可以分为如下三层: (与MVC不同,MVC是思想)
- 表现层
- 业务逻辑层
- 数据持久层
表现层和业务逻辑层可以自行拆分,各自实现MVC架构。
轻量级JAVA EE架构以Spring IoC容器为核心,承上启下: 其向上管理来自表现层的Action,向下管理业务逻辑层组件,同时负责管理业务逻辑层所需的DAO对象。
Struts2(表现层) <--- Spring(业务逻辑层:Ioc容器,AOP支持) <-----Hibernate(数据持久层:数据源/连接池) Struts---Spring: Data Transfer Object. Spring --- Hibernate: Domain Model Object.
DAO组件是整个Java EE应用的持久层访问的重要组件。Spring对实现DAO组件提供了许多工具类,系统的DAO组件可通过集成这些工具类完成,从而可以更加简便地实现DAO组件。 Spring提供了一系列的抽象类,这些抽象类将作为应用中DAO实现类的父类。通过集成这些抽象类,Spring简化了DAO的开发步骤,能以一致的方式使用数据库访问技术。所以不管底层采用JDBC,JDO还是Hibernate,应用中都可采用一致的编程模型。
对于Hibernate, Spring提供了如下三个工具类来支持DAO组件的实现: HibernateDaoSupport HibernateTemplate HibernateCallback
8.7.2 管理Hibernate的SessionFactory 当通过Hibernate进行持久层访问时,必须先获得SessionFactory对象,它是单个数据库映射关系编译后的内存镜像。 大部分情况下,一个JavaEE应用对应一个数据库,即对应一个SessionFactory对象。
在纯粹的Hibernate访问中,应用程序需要手动创建SessionFactory实例。 在实际中,我们希望以一种声明式的方式管理SessionFactory实例,直接以配置文件来管理SessionFactory实例。
一旦在Spring的IoC容器中配置了SessionFactory Bean,它将随应用的启动而加载,并可以充分利用IoC容器的功能,将SessionFactory Bean注入任何Bean,比如DAO组件。
声明式的方式管理SessionFactory,提供更好的适应性:当持久层服务需要更改时,程序代码无须任何改变。
8.7.3 使用HibernateTemplate HibernateTemplate提供持久层访问模板化,它只需要提供一个SessionFactory的应用,就可执行持久化操作。 SessionFactory对象既可通过构造参数传入,也可以通过设值方式传入。
对Web应用,通常应用启动时会自行创建ApplicationContext, 而SessionFactory和DAO对象都处在Spring容器的管理下,因此无须在代码中显示设置,可采用依赖注入实现SessionFactory和DAO解耦。
8.7.4.使用HibernateCallback 使用HibernateTemplate进行数据库访问十分方便,但是灵活性不足。 如果我们希望使用Hibernate Api进行持久化访问就不行了。 为了避免HibernateTemplate灵活性不足的缺陷,HibernateTemplate 还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。 这种访问方式通过如下两个方法完成: Obejct execute(HibernateCallback action) List execute(HibernateCallback action)
两个方法都需要HibernateCallback对象,HibernateCallback是一个接口,包含一个方法doInHibernate(org.hibernate.Session session)。 一旦获得Hibernate Session的应用,我们可以完全以Hibernate的方式进行数据库访问。
所以,一般情况下用HibernateTemplate,如果需要自定义复杂操作时,使用HibernateCallback实现。
8.7.5 实现DAO组件 Spring工具类:HibernateDaoSupport可实现DAO组件: HibernateTemplate getHibernateTemplate() void setSessionFactory(SessionFactory sessionFactory)
public class PersonDaoHibernate extends HibernateDaoSupport implements PersonDao{ public Person get(Integer id) { return getHibernateTemplate().get(Person.class, id); } }
MVC框架的控制器?