01Hibernate在Spring中的事务管理

10.4管理SessionFactory
SessionFactory:单个数据库映射关系编译后的内存镜像。大部分情况下,一个J2EE应用对应一个数据库。Spring通过ApplicationContext管理SessionFactory,无须采用单独Hiberate应用必需的hibernate.cfg.xml文件。

SessionFactory与数据库的连接,都由Spring的配置管理。实际的J2EE应用,通常使用数据源,数据源会采用依赖注入的方式,传给Hibernate的SessionFactory。具体配置如下所示:

<?xml version="1.0" encoding="gb2312"?>

<!--  Spring配置文件的DTD定义-->

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">

<!--  Spring配置文件的根元素是beans-->

<beans>

         <!--定义数据源, 该bean的ID为dataSource-->

         <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

                   <!--  指定数据库驱动-->

           <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>

                   <!--  指定连接数据库的URL-->                 

           <property name="url"><value>jdbc:mysql://wonder:3306/j2ee</value></property>

                   <!--  root为数据库的用户名-->

           <property name="username"><value>root</value></property>

                   <!--  pass为数据库密码-->

           <property name="password"><value>pass</value></property>

    </bean>

         <!--定义Hibernate的SessionFactory-->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

           <!--  依赖注入数据源,注入正是上文定义的dataSource>

           <property name="dataSource"><ref local="dataSource"/></property>

                   <!--  mappingResouces属性用来列出全部映射文件>

           <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>

                                     <!--  不同数据库连接,启动时选择create,update,create-drop-->

                         <prop key="hibernate.hbm2ddl.auto">update</prop>

                    </props>

        </property>

    </bean>

</beans>

SessionFactory由ApplicationContext管理,会随着应用启动时候自动加载。SessionFactory可以被处于ApplicaionContext管理的任意一个bean引用,比如DAO。Hibernate的数据库访问需要在Session管理下,而SessionFactory是Session的工厂。Spring采用依赖注入为DAO对象注入SessionFactory的引用。

Spring更提供Hibernate的简化访问方式,Spring采用模板设计模式,提供Hibernate访问与其他持久层访问的一致性。如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI即可。对上文的SessionFactory无须任何修改,只需将dataSource的配置替换成JNDI数据源,将原有的dataSource Bean替换成如下所示:

<!--  此处配置JNDI数据源-->

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

         <property name="jndiName">

                   <!--  指定数据源的JNDI-->

                   <value>java:comp/env/jdbc/myds</value>

         </property>

</bean>

 

10.5  Spring对Hibernate的简化
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持久层操作,这些操作大多只需一行代码,非常简洁。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值