没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
HibernateCallback 使用方法
1.5 Spring 整合 Hibernate
时至今日,可能极少有 J2EE 应用会直接以 JDBC 方式进行持久层访问。毕竟,用面向对象的程序设计语
言来访问关系型数据库,是一件让人沮丧的事情。大部分时候,J2EE 应用都会以 ORM 框架来进行持久层访
问,在所有的 ORM 框架中,Hibernate 以其灵巧、轻便的封装赢得了众多开发者的青睐。
Spring 具有良好的开放性,能与大部分 ORM 框架良好整合。下面将详细介绍 Spring 与 Hibernate 的整合。
1.5.1 Spring 提供的 DAO 支持
DAO 模式是一种标准的 J2EE 设计模式,DAO 模式的核心思想是,所有的数据库访 问,都通过 DAO 组
件完成,DAO 组件封装了数据库的增、删、改等原子操作。而业务逻辑组件则依赖于 DAO 组件提供的数据库
原子操作,完成系统业务逻辑的实现。
对于 J2EE 应用的架构,有非常多的选择,但不管细节如何变换,J2EE 应用都大致可分为如下 3 层:
● 表现层。
● 业务逻辑层。
● 数据持久层。
轻量级 J2EE 架构以 Spring IoC 容器为核心,承上启下。其向上管理来自表现层的 Action,向下管理业务
逻辑层组件,同时负责管理业务逻辑层所需的 DAO 对象。各层之间负责传值的是值对象,也就是 JavaBean
实例。
图 1.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,应用中都可采用一致的编程模型。
图 1.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。
1.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 文件
中进行配置。这种方式是为了提供更好的适应性,当持久层服务需要更改时,应用代码无须任何改变。
1.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"?>
剩余13页未读,继续阅读
资源评论
全栈攻城狮
- 粉丝: 0
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于JSP水产品销售系统源码.zip
- 基于JSP手机商城管理系统源码.zip
- 5.3.1_1二叉树的先中后序遍历.mp420240404-134540.png
- 基于JSP实现一个C语言教学网站平台源码.zip
- 抖音快手-课程网盘链接提取码下载 .txt
- 934742083249391XGOBOTV1.2.4.apk
- 课程设计基于OpenCV的材料缺陷检测程序python源码(含超详细注释).zip
- 基于python和百度EsayDL实现自动驾驶算法+基于ESP32开发板作为智能车主控芯片的自动驾驶智能车项目+源码(高分项目)
- Centos7-离线安装-MySQL5-7-31-tar包安装
- 蓝海平台带货-课程网盘链接提取码下载 .txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功