Spring中的Hibernate事务:
如果应用持久层是用Hibernate实现的,就会用到HibernateTransactionManager。在应用中使用下面所有的XML来声明它。
<bean id = "transactionManager" class = "org.springframework.orm.hibernate.HibernateTransactionManager">
<property name = " sessionFactory
" >
<ref bean = "sessionFactory
" />
</property>
</bean>
其中,sessionFactory
属性必须和一个Hibernate的SessionFactory
绑定。如下:
<!--定义一个hibernate
的SessionFactory
-->
<bean id="sessionFactory
"
class="org.springframework.orm.hibernate3.LocalSessionFactory
Bean">
<!--
定义SessionFactory
必须注入数据库属性DataSource-->
<property
name="dataSource">
<ref
local="dataSource"/>
</property>
<!--
在<list>中,
列出所有的PO
映射文件-->
<property
name="mappingResources">
<list>
<value>Person.hbm.xml</value>
</list>
</property>
<!-- 定义hibernate的属性-->
<property
name="hibernateProperties">
<props>
<!--此处用来定义hibernate
的SessionFactory
的属性:不同数据库连接启动时选择create , update ,
create-drop-->
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop
key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
HibernateTransactionManager把事务管理委托给一个从Hibernate session中取得的net.sf.hibernate.Transaction对象,当一个事务完成时,HibernateTransactionManager将调用Transaction对象的commit()方法。类似的,当一个事务失败时,Transaction对象的rollback()方法将被调用。
用BeanNameAutoProxyCreator
自动创建事务代理
下面介绍-种优秀的事务代理配置策略,采用这种配置策略,完全可以避免增量式配置,使所有的事务代理由系统自动创建。由于容器中的目标bean
自动消失,可避免需要使用嵌套bean 来保证目标bean 不可被访问。
这种配置方式依赖于Spring 提供的bean
后处理器,该后处理器用于为每个bean 自动创建代理,此处的代理不仅可以是事务代理,也可以是任意的代理,只需要有合适的拦截器即可。这些是AOP
框架的概念,笔者在此处不AOP 进行深入介绍。读者只需了解这种事务代理的配置方式即可。
下面是采用BeanNameAutoProxyCreator
配置事务代理的配置文件:
<?xml version="1.0" encoding="gb2312"?>
<!一Spring 配置文件的文件头,包含DTD
等信息-->
<lDOCTYPE beans PUBLIC "-IISPRINGIIDTD
BEANIIEN"
''http://www.
spr工ngfrarnework.org/dtd/spring-beans.dtd">
<beans>
<!- - 定义数据源-->
<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://localhost:3306/spring</value></property>
<!-- 定义数据库用户名-->
<property name=
"username" ><value>root</value></property>
<!-- 定义数据库密码-->
<property
name="password"><value>32147</value></property>
</bean>
<!--定义一个hibernate
的SessionFactory
-->
<bean id="sessionFactory
"
class="org.springframework.orm.hibernate3.LocalSessionFactory
Bean">
<!--
定义SessionFactory
必须注入数据库属性DataSource-->
<property
name="dataSource">
<ref
local="dataSource"/>
</property>
<!--
在<list>中,
列出所有的PO
映射文件-->
<property
name="mappingResources">
<list>
<value>Person.hbm.xml</value>
</list>
</property>
<!-- 定义hibernate的属性-->
<property
name="hibernateProperties">
<props>
<!--此处用来定义hibernate
的SessionFactory
的属性:不同数据库连接启动时选择create , update ,
create-drop-->
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop
key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--配置事务管理器 ,使用适用于Hibernate 的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean 需要依赖注入一个SessionFactory bean 的引用-->
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
<!-- 配置事务拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事务拦截器bean 需要依赖注入一个事务管理器-->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!-- 下面定义事务传播属性-->
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!--定义BeanNameAutoProxyCreator ,该bean 是个bean 后处理器,无须被引用,因此没有id 属性。这个bean 后处理器,根据事务拦截器为目标bean 自动创建事务代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
<!-- 指定对满足哪些bean name 的bean 自动生成业务代理 -->
<property name="beanNames">
<!--下面是所有需要自动创建事务代理的bean-->
<list>
<value>customerDAO</value>
</list>
</property>
<!--下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
</beans>
TranscationInterceptor是一个事务拦截器bean,需要传入一个TransactionManager的引用。配置中使用Spring
依赖注入该属性,事务拦截器的事务属性通过transactionAttributes 来指定,该属性有props
子元素,并在配置文件中定义了三个事务传播规则。
所有以insert
开始的方法,都采用PROPAGATION_REQUIRED的事务传播规则。当程序抛出MyException异常及其子异常时,会自动回滚事务:所有以find
开头的方法,都采用PROPAGATION_REQUIRED事务传播规则,并且具有只读性;其他方法则采用PROPAGATION_REQUIRED的事务传播规则。BeanNameAutoProxyCreator是根据bean
名生成自动代理的代理创建器,该bean 通常需要接受两个参数:第一个是beanNames 属性,该属性用来设置哪些bean
需要自动生成代理,另一个属性是interceptorNames,该属性则指定事务拦截器,在自动创建事务代理时,系统会根据这些事务拦截器的属性来生成对应的事务代理。
为了让读者对这种配置方式有信息,可PersonDaoHibemate的save 方法进行简单修改,修改后的save
方法如下:
/**
*保存person 实例
* @param person 需要保存的Person 实例
*/
public
void save(Person person)
{
getHibernateTemplate()
.save(person);
//下面两行代码没有实际意义,仅仅为了引发数据库异常
DataSource ds =
null;
DataSourceUtils.getConnection(ds);
在主程序中调用该save 方法,主程序调用save
方法的代码如下:
for(int i = 0 ; i < 10 ; i++ )
{
// 保存Person
实例
pdao.save(new Person(String.valueOf(i) , i +
10));
执行完主程序的该片段后,数据库不会插入任何记录。如果BeanNameAutoProxyCreator 的配置修改成如下格式:
<! --定义BeanNameAutoProxyCreator,该bean 是个bean
后处理器,无须被引用,因此没有id 属性这个bean 后处理器,根据事务拦截器为目标bean 自动创建事务代理-->
<bean
c1ass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!--指定对满足哪些bean name 的bean
自动生成业务代理-->
<property name="beanNames">
<!--下面是所有需要自动创建事务代理的bean-->
<list>
<!--
<value>personDao</value> -->
</list>
<!一此处可增加其他需要自动创建事务代理的bean-->
</property>
<!--
下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property
name="interceptorNames">
<list>
<value>transactionInterceptor</va1ue
>
<!--此处可增加其他新的Interceptor
-->
</list>
</property>
</bean>
注意配置文中beanNames属性的变化,将所有personDao项加注释
,即不再为该bean生成事务代理。再次执行主程序,此时程序虽然抛出了数据库异常,但数据记录依然被插入数据库。
这种配置方式相当简洁,每次都增加了新的bean。如果需要该bean
的方法具有事务性,只需在BeanNameAutoProxyCreator 的beanNames 属性下作相应修改。该行告诉bean 后处理需要为哪个bean
生成事务代理。
注意:采用BeanNameAutoProxyCreator 配直事务代理时,无须为每个目标额外配直
多余的事务代理,可由系统自动为其创建事务代理。事实上,BeanNameAutoProxyCreator
并不是专用于创建事务代理,它可以根据配直的拦截器列表生成代理。在该系统中,只
指定了一个transactionInterceptor ,该拉截器是事务栏截器,由Spring 提供实现。该拦截
器也可以由用户提供,在后面的表现层组件中可以看到用户自定义的授权拦截器。
分享到:
相关推荐
在`Spring_1800_Spring_Hibernate_Transaction_Annotation`这个压缩包文件中,很可能包含了使用注解方式实现Spring整合Hibernate事务处理的相关示例代码和配置文件。通过阅读和理解这些代码,你可以更好地掌握这一...
标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...
标题"spring整合hibernate示例代码"提示我们,我们将讨论如何在实际项目中结合这两个框架。Spring可以帮助管理Hibernate的SessionFactory和Transaction,提供声明式事务管理,以及通过AOP(面向切面编程)实现更灵活...
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
本文将深入探讨Spring整合Hibernate的相关知识点,适合初学者入门。 首先,我们需要理解Spring的核心理念。Spring框架提供了一个轻量级的容器,它能够管理应用程序中的对象,包括初始化、配置和依赖注入。AOP则是...
在本文中,我们将深入探讨如何将Spring框架与Hibernate ORM(对象关系映射)框架整合,以便在实际项目中实现高效、灵活的数据访问层。Spring以其强大的依赖注入和管理能力,结合Hibernate的数据库操作功能,可以构建...
总的来说,Spring与Hibernate的整合让开发者可以利用Spring的高级特性,如AOP事务管理,同时享受Hibernate带来的便捷数据库操作。这一过程涉及到多个配置步骤,但一旦设置完成,就能大大提高开发效率,降低项目的...
标题中的“spring整合hibernate的jar包”指的是在Java Web开发中,Spring框架与Hibernate持久层框架的集成。这两个框架结合使用可以提供强大的数据访问和业务逻辑处理能力。Spring作为一个全面的轻量级框架,提供了...
下面我们将详细讲解如何进行Spring AOP整合Hibernate以及如何在其中使用事务。 1. **Spring AOP简介** 面向切面编程(AOP)是Spring框架的核心特性之一,它允许开发者定义“切面”,这些切面可以包含业务逻辑的...
将Hibernate与Spring整合可以充分利用两者的优点,提高开发效率并降低复杂性。 一、Hibernate概述 Hibernate是Java世界中领先的ORM框架之一,它允许开发者用Java对象来操作数据库记录,而无需编写SQL语句。通过配置...
**Spring3整合Hibernate4测试Demo** 在Java Web开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用程序框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及其他...
这篇名为"spring整合hibernate实例"的内容,显然是关于如何将这两个框架协同工作,构建一个高效、灵活的Java应用的教程。在整合过程中,我们将探讨以下几个关键知识点: 1. **Spring的ApplicationContext**: 这是...
《Spring整合Hibernate实战指南》 在Java开发领域,Spring框架以其强大的依赖注入、AOP(面向切面编程)以及丰富的模块支持,成为了企业级应用开发的首选。而Hibernate作为持久层框架,以其对象关系映射(ORM)能力...
首先,我们需要理解Spring如何与Hibernate和Struts进行整合: 1. **Spring与Hibernate整合**: - Spring通过其`HibernateTemplate`或`HibernateDaoSupport`类简化了对Hibernate的操作,提供了事务管理。你可以定义...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第11部分,重点可能是建立在前几部分的基础之上,进一步深化对这三个核心技术的理解和实践。 ...
"spring+hibernate整合jar包"是一个包含所有必需组件的压缩包,用于帮助开发者快速搭建一个基于Spring、Hibernate和Spring MVC的项目。这个压缩包中的"lib"目录,通常会包含以下关键的jar文件: 1. **Spring框架**...
这些接口通常由Spring管理,通过代理模式实现事务控制。 6. 编写Controller:定义处理HTTP请求的Controller类,注入DAO,调用其方法处理业务逻辑。Controller将请求转发给相应的Service,Service再调用DAO完成...
Spring与Hibernate的整合主要体现在以下几个方面: 1. **数据源配置**:Spring可以通过其DataSource Bean管理数据库连接,提供对多个数据源的支持,以及事务管理的能力。 2. **SessionFactory的管理**:Spring可以...
在这个整合过程中,Spring会管理Hibernate SessionFactory的生命周期,并通过AOP代理来处理事务。当需要执行数据库操作时,Spring会自动开启和提交/回滚事务,简化了开发者的代码。 总的来说,"spring+hibernate...
总结来说,Spring 与 Hibernate 的整合主要涉及 SessionFactory 的配置、DAO 类的实现以及事务管理。通过 Spring 的 IoC 容器管理数据访问资源,可以使应用更加解耦,同时利用 Spring 的事务管理功能,可以简化事务...