- 浏览: 76536 次
- 性别:
- 来自: z驻马店
文章分类
最新评论
6.5 Spring整合Hibernate 时至今日,可能极少有J2EE应用会直接以JDBC方式进行持久层访问。毕竟,用面向对象的程序设计语言来访问关系型数据库,是一件让人沮丧的事情。大部分时候,J2EE应用都会以ORM框架来进行持久层访问,在所有的ORM框架中,Hibernate以其灵巧、轻便的封装赢得了众多开发者的青睐。 Spring具有良好的开放性,能与大部分ORM框架良好整合。下面将详细介绍Spring与Hibernate的整合。 6.5.1 Spring提供的DAO支持 DAO模式是一种标准的J2EE设计模式,DAO模式的核心思想是,所有的数据库访 问,都通过DAO组件完成,DAO组件封装了数据库的增、删、改等原子操作。而业务逻辑组件则依赖于DAO组件提供的数据库原子操作,完成系统业务逻辑的实现。 对于J2EE应用的架构,有非常多的选择,但不管细节如何变换,J2EE应用都大致可分为如下3层: ● 表现层。 ● 业务逻辑层。 ● 数据持久层。 轻量级J2EE架构以Spring IoC容器为核心,承上启下。其向上管理来自表现层的Action,向下管理业务逻辑层组件,同时负责管理业务逻辑层所需的DAO对象。各层之间负责传值的是值对象,也就是JavaBean实例。 图6.5精确地描绘了轻量级J2EE架构的大致情形。 DAO组件是整个J2EE应用的持久层访问的重要组件,每个J2EE应用的底层实现都难以离开DAO组件的支持。Spring对实现DAO组件提供了许多工具类,系统的DAO组件可通过继承这些工具类完成,从而可以更加简便地实现DAO组件。 Spring的DAO支持,允许使用相同的方式、不同的数据访问技术,如JDBC、Hibernate或JDO。Spring的DAO在不同的持久层访问技术上提供抽象,应用的持久层访问基于Spring的DAO抽象。因此,应用程序可以在不同的持久层技术之间切换。 Spring提供了一系列的抽象类,这些抽象将被作为应用中DAO实现类的父类。通过继承这些抽象类,Spring简化了DAO的开发步骤,能以一致的方式使用数据库访问技术。不管底层采用JDBC、JDO或Hibernate,应用中都可采用一致的编程模型。 图6.5 轻量级J2EE应用架构 应用的DAO类继承这些抽象类,会大大简化应用的开发。最大的好处是,继承这些抽象类的DAO能以一致的方式访问数据库,意味着应用程序可以在不同的持久层访问技术中切换。 除此之外,Spring提供了一致的异常抽象,将原有的Checked异常转换包装成Runtime异常,因而,编码时无须捕获各种技术中特定的异常。 Spring DAO体系中的异常,都继承DataAccessException,而DataAccessException异常是Runtime的,无须显式捕捉。通过DataAccessException的子类包装原始异常信息,从而保证应用程序依然可以捕捉到原始异常信息。 Spring 提供了多种数据库访问技术的DAO支持,包括Hibernate、JDO、TopLink、iBatis、OJB等。Spring可以使用相同的访问模式、不同的数据库访问技术。就Hibernate的持久层访问技术而言,Spring提供了如下3个工具类(或接口)来支持DAO组件的实现: ● HibernateDaoSupport。 ● HibernateTemplate。 ● HibernateCallBack。 6.5.2 管理Hibernate的SessionFactory 前面介绍Hibernate时已经知道,在通过Hibernate进行持久层访问时,Hibernate的SessionFactory是一个非常重要的对象,它是单个数据库映射关系编译后的内存镜像。大部分情况下,一个J2EE应用对应一个数据库,也即对应一个SessionFactory对象。 在纯粹的Hibernate访问中,应用程序需要手动创建SessionFactory实例,可想而知,这不是一个优秀的策略。在实际开发中,希望以一种声明式的方式管理SessionFactory实例,直接以配置文件来管理SessionFactory实例,在示范Struts的PlugIn扩展点时,大致示范了这种方式(请参阅2.12.1节的内容)。 Spring的IoC容器则提供了更好的管理方式,它不仅能以声明式的方式配置Session- Factory实例,也可充分利用IoC容器的作用,为SessionFactory注入数据源引用。 下面是Spring配置文件中配置Hibernate SessionFactory的示范代码: <?xml version="1.0" encoding="GBK"?> <!-- beans是Spring配置文件的根元素,并且指定了Schema信息 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义数据源Bean,使用C3P0数据源实现 --> <bean id="dataSource" class="com.mchange.v2.c3p0. ComboPooledDataSource" destroy-method="close"> <!-- 指定连接数据库的驱动 --> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定连接数据库的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/> <!-- 指定连接数据库的用户名 --> <property name="user" value="root"/> <!-- 指定连接数据库的密码 --> <property name="password" value="32147"/> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="40"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接最大空闲时间 --> <property name="maxIdleTime" value="20"/> </bean> <!-- 定义Hibernate的SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3. LocalSessionFactoryBean"> <!-- 依赖注入数据源,正是上文定义的dataSource --> <property name="dataSource" ref="dataSource"/> <!-- mappingResources属性用来列出全部映射文件 --> <property name="mappingResources"> <list> <!-- 以下用来列出所有的PO映射文件 --> <value>lee/MyTest.hbm.xml</value> </list> </property> <!-- 定义Hibernate的SessionFactory属性 --> <property name="hibernateProperties"> <props> <!-- 指定Hibernate的连接方言 --> <prop key="hibernate.dialect">org.hibernate.dialect. MySQLDialect</prop> <!-- 配置启动应用时,是否根据Hibernate映射自动创建数据表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> </beans> 一旦在Spring的IoC容器中配置了SessionFactory Bean,它将随应用的启动而加载,并可以充分利用IoC容器的功能,将SessionFactory Bean注入任何Bean,比如DAO组件。一旦DAO组件获得了SessionFactory Bean的引用,就可以完成实际的数据库访问。 当然,Spring也支持访问容器数据源。如果需要使用容器数据源,可将数据源Bean修改成如下配置: <!-- 此处配置JNDI数据源 --> <bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <!-- 指定数据源的JNDI --> <value>java:comp/env/jdbc/myds</value> </property> </bean> 可见,以声明式的方式管理SessionFactory实例,可以让应用在不同数据源之间切换。如果应用更换数据库等持久层资源,只需对配置文件进行简单修改即可。 提示:以声明式的方式管理SessionFactory,非常类似于早期将数据库服务的相关信息放在web.xml文件中进行配置。这种方式是为了提供更好的适应性,当持久层服务需要更改时,应用代码无须任何改变。 6.5.3 使用HibernateTemplate HibernateTemplate 提供持久层访问模板,使用HibernateTemplate无须实现特定接口,它只需要提供一个SessionFactory的引用就可执行持久化操作。SessionFactory对象既可通过构造参数传入,也可通过设值方式传入。HibernateTemplate提供如下3个构造函数: ● HibernateTemplate()。 ● HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。 ● HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate)。 第一个构造函数,构造一个默认的HibernateTemplate实例。因此,使用Hibernate- Template实例之前,还必须使用方法setSessionFactory(SessionFactory sessionFactory)来为HibernateTemplate传入SessionFactory的引用。 第二个构造函数,在构造时已经传入SessionFactory引用。 第三个构造函数,其boolean型参数表明,如果当前线程已经存在一个非事务性的Session,是否直接返回此非事务性的Session。 在Web应用中,通常启动时自动加载ApplicationContext,SessionFactory和DAO对象都处在Spring上下文管理下,因此无须在代码中显式设置,可采用依赖注入完成Session- Factory和DAO的解耦,依赖关系通过配置文件来设置,如下所示: <?xml version="1.0" encoding="GBK"?> <!-- beans是Spring配置文件的根元素,并且指定了Schema信息 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义数据源Bean,使用C3P0数据源实现 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 指定连接数据库的驱动 --> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定连接数据库的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/> <!-- 指定连接数据库的用户名 --> <property name="user" value="root"/> <!-- 指定连接数据库的密码 --> <property name="password" value="32147"/> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="40"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接最大空闲时间 --> <property name="maxIdleTime" value="20"/> </bean> <!-- 定义Hibernate的SessionFactory Bean --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3. LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入的正是上文中定义的dataSource --> <property name="dataSource" ref="dataSource"/> <!-- mappingResources属性用来列出全部映射文件 --> <property name="mappingResources"> <list> <!-- 以下用来列出所有的PO映射文件 --> <value>lee/Person.hbm.xml</value> </list> </property> <!-- 定义Hibernate的SessionFactory属性 --> <property name="hibernateProperties"> <props> <!-- 指定Hibernate的连接方言 --> <prop key="hibernate.dialect">org.hibernate.dialect. MySQLDialect</prop> <!-- 指定启动应用时,是否根据Hibernate映射文件创建数据表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- 配置Person持久化类的DAO bean --> <bean id="personDao" class="lee.PersonDaoImpl"> <!-- 采用依赖注入来传入SessionFactory的引用 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> </beans> 在 PersonDao组件中,所有的持久化操作都通过HibernateTemplate实例完成,而HibernateTemplate操作数据库非常简洁,大部分CRUD操作都可通过一行代码解决问题。下面介绍如何通过HibernateTemplate进行持久层访问。 HibernateTemplate 提供了非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加了对命名SQL查询的支持,也增加了对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介: ● void delete(Object entity),删除指定持久化实例。 ● deleteAll(Collection entities),删除集合内全部持久化类实例。 ● find(String queryString),根据HQL查询字符串来返回实例集合。 ● findByNamedQuery(String queryName),根据命名查询返回实例集合。 ● get(Class entityClass, Serializable id),根据主键加载特定持久化类的实例。 ● save(Object entity),保存新的实例。 ● saveOrUpdate(Object entity),根据实例状态,选择保存或者更新。 ● update(Object entity),更新实例的状态,要求entity是持久状态。 ● setMaxResults(int maxResults),设置分页的大小。 通过上面实现DAO组件的代码可以看出,通过HibernateTemplate进行持久层访问的代码如此清晰,大部分CRUD操作一行代码即可完成,完全无须Hibernate访问那些繁琐的步骤。而且,一旦DAO组件获得了SessionFactory的引用,即可很轻易地创建 HibernateTemplate实例。 提示:HibernateTemplate是Spring众多模板工具类之一,Spring正是通过这种简便地封装,完成了开发中大量需要重复执行的工作。 6.5.4 使用HibernateCallBack HibernateTemplate还提供了一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式可通过如下两个方法完成: ● Object execute(HibernateCallback action)。 ● List execute(HibernateCallback action)。 这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装 Hibernate后灵活性不足的缺陷。 HibernateCallback 是一个接口,该接口包含一个方法doInHibernate(org.hibernate. Session session),该方法只有一个参数Session。在开发中提供HibernateCallback实现类时,必须实现接口里包含的 doInHibernate方法,在该方法体内即可获得Hibernate Session的引用,一旦获得了Hibernate Session的引用,就可以完全以Hibernate的方式进行数据库访问。 注意:doInHibernate方法内可以访问Session,该Session对象是绑定在该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证了对于复杂的持久层访问,依然可以使用Hibernate的访问方式 6.5.6 使用IoC容器组装各种组件 至此为止,J2EE应用所需要的各种组件都已经出现了,从MVC层的控制器组件,到业务逻辑组件,以及持久层的DAO组件,已经全部成功实现。应用程序代码并未将这些组件耦合在一起,代码中都是面向接口编程,因此必须利用Spring的IoC容器将他们组合在一起。 从用户角度来看,用户发出HTTP请求,当MVC框架的控制器组件拦截到用户请求时,将调用系统的业务逻辑组件,而业务逻辑组件则调用系统的DAO组件,而DAO组件则依赖于SessionFactory和DataSource等底层组件实现数据库访问。 从系统实现角度来看,IoC容器先创建SessionFactory和DataSource等底层组件,然后将这些底层组件注入给DAO组件,提供一个完整的DAO组件,并将此DAO组件注入给业务逻辑组件,从而提供一个完整的业务逻辑组件,而业务逻辑组件又被注入给控制器组件,控制器组件负责拦截用户请求,并将处理结果呈现给用户——这一系列的衔接都由Spring的IoC容器提供实现。 下面给出关于如何在容器中配置J2EE组件的大致模板,其模板代码如下: <?xml version="1.0" encoding="GBK"?> <!-- beans是Spring配置文件的根元素,并且指定了Schema信息 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义数据源Bean,使用C3P0数据源实现 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 指定连接数据库的驱动 --> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定连接数据库的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/> <!-- 指定连接数据库的用户名 --> <property name="user" value="root"/> <!-- 指定连接数据库的密码 --> <property name="password" value="32147"/> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="40"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接最大空闲时间 --> <property name="maxIdleTime" value="20"/> </bean> <!-- 定义Hibernate的SessionFactory Bean --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3. LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入的正是上文中定义的dataSource --> <property name="dataSource" ref="dataSource"/> <!-- mappingResources属性用来列出全部映射文件 --> <property name="mappingResources"> <list> <!-- 以下用来列出所有的PO映射文件 --> <value>lee/Person.hbm.xml</value> <!-- 此处还可列出更多的PO映射文件 --> </list> </property> <!-- 定义Hibernate的SessionFactory属性 --> <property name="hibernateProperties"> <props> <!-- 指定Hibernate的连接方言 --> <prop key="hibernate.dialect">org.hibernate.dialect. MySQLDialect</prop> <!-- 指定启动应用时,是否根据Hibernate映射文件创建数据表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- 配置Person持久化类的DAO Bean --> <bean id="personDao" class="lee.PersonDaoImpl"> <!-- 采用依赖注入来传入SessionFactory的引用 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 下面能以相同的方式配置更多的持久化Bean --> ... <bean id="myService" class="lee.MyServiceImp"> <!-- 注入业务逻辑组件所必需的DAO组件 --> <property name="peronDdao" ref=" personDao "/> <!-- 此处可采用依赖注入更多的DAO组件 --> ... </bean> <!-- 配置控制器Bean,设置起作用域为Request --> <bean name="/login" class="lee.LoginAction" scope="request"> <!-- 依赖注入控制器所必需的业务逻辑组件 --> <property name="myService" ref=" myService "/> </bean> </beans> 在上面的配置文件中,同时配置了控制器Bean、业务逻辑组件Bean、DAO组件Bean以及一些基础资源Bean。各组件的组织被解耦到配置文件中,而不是在代码层次的低级耦合。 当客户端的HTTP请求向/login.do发送请求时,将被容器中的lee.LoginAction拦截,LoginAction调用myService Bean,myService Bean则调用personDao等系列DAO组件,整个流程将系统中的各组件有机地组织在一起。 注意:在实际应用中,很少会将DAO组件、业务逻辑组件以及控制组件都配置在同一个文件中。而是在不同配置文件中,配置相同一组J2EE应用组件。
相关推荐
标题"spring整合hibernate示例代码"提示我们,我们将讨论如何在实际项目中结合这两个框架。Spring可以帮助管理Hibernate的SessionFactory和Transaction,提供声明式事务管理,以及通过AOP(面向切面编程)实现更灵活...
标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...
本篇文章将详细探讨如何通过Spring整合Hibernate来实现事务处理,重点介绍注解方式和XML配置方式。 首先,我们了解事务处理在数据库操作中的重要性。事务是一组操作,这些操作要么全部成功,要么全部失败,确保数据...
标题中的“spring整合hibernate的jar包”指的是在Java Web开发中,Spring框架与Hibernate持久层框架的集成。这两个框架结合使用可以提供强大的数据访问和业务逻辑处理能力。Spring作为一个全面的轻量级框架,提供了...
本文将深入探讨Spring整合Hibernate的相关知识点,适合初学者入门。 首先,我们需要理解Spring的核心理念。Spring框架提供了一个轻量级的容器,它能够管理应用程序中的对象,包括初始化、配置和依赖注入。AOP则是...
Spring4整合Hibernate4实现用户购买图书和结账等操作,整合主要实现用IoC容器来管理Hibernate的SessionFactory实例,并使Hibernate使用Spring所提供的声明式事务……
这篇名为"spring整合hibernate实例"的内容,显然是关于如何将这两个框架协同工作,构建一个高效、灵活的Java应用的教程。在整合过程中,我们将探讨以下几个关键知识点: 1. **Spring的ApplicationContext**: 这是...
《Spring整合Hibernate实战指南》 在Java开发领域,Spring框架以其强大的依赖注入、AOP(面向切面编程)以及丰富的模块支持,成为了企业级应用开发的首选。而Hibernate作为持久层框架,以其对象关系映射(ORM)能力...
Spring整合Hibernate是现代Java开发中常见的一种技术组合,利用Spring框架的强大功能来管理和协调Hibernate的持久化操作。Spring为Hibernate提供了全面的集成方案,简化了DAO(Data Access Object)的开发,同时也...
首先,我们需要理解Spring如何与Hibernate和Struts进行整合: 1. **Spring与Hibernate整合**: - Spring通过其`HibernateTemplate`或`HibernateDaoSupport`类简化了对Hibernate的操作,提供了事务管理。你可以定义...
下面,我们将深入探讨Spring整合Hibernate的相关知识点。 1. **依赖注入**:Spring框架的核心特性之一是依赖注入(DI),它允许我们在不进行硬编码的情况下管理对象之间的依赖关系。在整合Hibernate时,Spring可以...
标题"spring整合hibernate与struts2所需jar包"表明我们需要关注的是如何将这三个框架整合在一起,并且提供了所需的一些基础组件。整合SSH可以让开发者利用Spring的管理能力,让Hibernate更易于使用,同时通过Struts2...
Spring整合Hibernate配置测试示例
在"spring整合hibernate开发源码"的压缩包中,可能包含了以下内容: 1. **配置文件**:如`applicationContext.xml`,其中配置了Spring和Hibernate的相关bean,如DataSource、SessionFactory、TransactionManager等。...
这里的jar包只是说Spring自带的关于Hibernate的jar包,即这四个jar包: hibernate3.jar, hibernate-annotations.jar, hibernate-entitymanager.jar hibernate-commons-annotations.jar 因为我原来下载了一个,但是...
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
Spring 整合 Hibernate 是一种常见的企业级应用开发模式,它将 Spring 框架的管理优势与 Hibernate 的持久层功能结合起来,提供了更高效、更稳定的应用解决方案。在本学习笔记中,我们将深入探讨如何实现这一整合,...
Spring整合Hibernate基于HibernateTemplate的方式,极大地简化了数据库操作,同时也让事务管理和代码的编写变得更加规范和高效。在实际项目中,可以根据需求进一步配置和优化,比如使用JPA的...
当我们谈到"Spring整合Hibernate例子"时,这意味着我们将探讨如何将这两个强大的框架结合在一起,以实现更高效、更灵活的数据库操作。 Spring框架的核心特性之一是依赖注入(Dependency Injection,DI),这使得...