给你详细讲一下SSH框架的事物管理,希望对你有帮助。Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:1、准备工作:可以利用hibernatetools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现关键就在于配置文件,下面看一个样例app.xml:?xmlversion=1.0encoding=utf-8?beansxmlns=:xsi=:schemaLocation=://!--配置数据源--beanid=dataSourceclass=com.mchange.v2.c3p0.ComboPooledDataSourcedestroy-method=close!--指定连接数据库的驱动--propertyname=driverClassvalue=com.mysql.jdbc.Driver/!--指定连接数据库的URL--propertyname=jdbcUrlvalue=jdbc:mysql://localhost/auction/!--指定连接数据库的用户名--propertyname=uservalue=root/!--指定连接数据库的密码--propertyname=passwordvalue=root/!--指定连接数据库连接池的最大连接数--propertyname=maxPoolSizevalue=20/!--指定连接数据库连接池的最小连接数--propertyname=minPoolSizevalue=1/!--指定连接数据库连接池的初始化连接数--propertyname=initialPoolSizevalue=1/!--指定连接数据库连接池的连接的最大空闲时间--propertyname=maxIdleTimevalue=20//bean!--配置数据库会话工厂--beanid=sessionFactoryclass=org.springframework.orm.hibernate3.LocalSessionFactoryBeanpropertyname=dataSourceref=dataSource/propertyname=mappingResourceslistvaluecom/ouya/User.hbm.xml/value/list/propertypropertyname=hibernatePropertiespropspropkey=hibernate.dialectorg.hibernate.dialect.MySQLDialect/proppropkey=hibernate.show_sqltrue/proppropkey=hibernate.cglib.use_reflection_optimizertrue/prop/props/property/bean!--配置事务管理器--beanid=transactionManagerclass=org.springframework.orm.hibernate3.HibernateTransactionManagerpropertyname=sessionFactoryreflocal=sessionFactory//property/bean!—-配置Spring事务管理器代理--beanid=transactionProxyFactoryabstract=truelazy-init=trueclass=org.springframework.transaction.interceptor.TransactionProxyFactoryBeanpropertyname=transactionManagerreflocal=transactionManager//propertypropertyname=transactionAttributespropspropkey=save*PROPAGATION_REQUIRED/proppropkey=insert*PROPAGATION_REQUIRED/proppropkey=del*PROPAGATION_REQUIRED/proppropkey=add*PROPAGATION_REQUIRED/proppropkey=update*PROPAGATION_REQUIRED/proppropkey=find*PROPAGATION_REQUIRED,readOnly/proppropkey=search*PROPAGATION_REQUIRED,readOnly/proppropkey=remove*PROPAGATION_REQUIRED,readOnly/proppropkey=query*PROPAGATION_REQUIRED,readOnly/proppropkey=list*PROPAGATION_REQUIRED,readOnly/proppropkey=count*PROPAGATION_REQUIRED,readOnly/proppropkey=get*PROPAGATION_REQUIRED,readOnly/prop/props/property/bean!--Hibernate模板--beanid=hibernateTemplateclass=org.springframework.orm.hibernate3.HibernateTemplatepropertyname=sessionFactoryreflocal=sessionFactory//property/bean!--服务层对象--beanid=usclass=com.ouya.UserServicepropertyname=userDaoreflocal=userDao//property/bean!--spring代理用户服务对象--beanid=userServiceparent=transactionProxyFactory!--如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常--!--propertyname=proxyTargetClassvalue=true/--propertyname=targetref=us//bean!--用户数据访问对象DATAACCESSOBJECT--beanid=userDaoclass=com.ouya.UserDAOpropertyname=hibernateTemplateref=hibernateTemplate//bean/beans可以看到配置文件的步骤:1、配置数据源2、配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)3、配置事务管理器(依赖注入上面的会话工厂)4、Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)后面的一些普通的bean配置就不用说了上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务程序中调用:UserServiceus=(UserService)app.getBean(userService);注:userService就是上面配置的代理对象的id,而不是原服务对象的id但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):1、增加一个事务拦截器beanid=transactionInterceptorclass=org.springframework.transaction.interceptor.TransactionInterceptorpropertyname=transactionManagerreflocal=transactionManager//propertypropertyname=transactionAttributespropspropkey=save*PROPAGATION_REQUIRED/proppropkey=insert*PROPAGATION_REQUIRED/proppropkey=del*PROPAGATION_REQUIRED/proppropkey=add*PROPAGATION_REQUIRED/proppropkey=update*PROPAGATION_REQUIRED/proppropkey=find*PROPAGATION_REQUIRED,readOnly/proppropkey=search*PROPAGATION_REQUIRED,readOnly/proppropkey=remove*PROPAGATION_REQUIRED,readOnly/proppropkey=query*PROPAGATION_REQUIRED,readOnly/proppropkey=list*PROPAGATION_REQUIRED,readOnly/proppropkey=count*PROPAGATION_REQUIRED,readOnly/proppropkey=get*PROPAGATION_REQUIRED,readOnly/prop/props/property/bean2、定义自动代理事务管理器!--定义BeanNameAutoProxyCreator--beanclass=org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator!--如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true--!--propertyname=proxyTargetClassvalue=