给你详细讲一下SSH框架的事物管理,希望对你有帮助。
Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:
1、 准备工作:
可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现
关键就在于配置文件,下面看一个样例app.xml:
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">
可以看到配置文件的步骤:
1、 配置数据源
2、 配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)
3、 配置事务管理器(依赖注入上面的会话工厂)
4、 Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)
后面的一些普通的bean配置就不用说了
上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务
程序中调用:UserService us = (UserService) app.getBean("userService");
注:userService就是上面配置的代理对象的id,而不是原服务对象的id
但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):
1、 增加一个事务拦截器
2、 定义自动代理事务管理器
然后我们在程序中调用时应如下:
UserService us = (UserService) app.getBean("us");
注:注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是
BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在
附录:
1、关于hibernate的属性详解:
Hibernate 会话厂 SessionFactory
Session 就是用于每次与数据库会话的,因此需要:
数据库的配置参数,这些参数就是 上面的数据源指定的! 因此我们只需引用即可: ref="dataSource";
实体映射配置 hibernate.cfg.xml 配置
结果缓存配置(这里使用的是开源的 ehcache)
2、Spring的transactionAttributes
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
PROPAGATION_REQUIRED意思是支持当前事务,如果当前没有事务,就新建一个事务。
insert*意思是对所有以insert开头的方法应用事务控制。
list, set, map和props元素分别用来设置类型为List,Set,Map和Propertis的属性值,分别用来为bean传入集合值
知道上很多答案都是乱答,复制粘贴的人很恶心。很多采纳的答案都是错的。
回答你第一个问题,引入键值对。
PROPAGATION_REQUIRED
XXXX
等等
key是键,prop标签中间是值。
等价于:
键1=值1
键2=值2
等等
你还可以配置外部properties文件,用context标签引入:
回答你第二个问题
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。是事物传播行为的一种(还有其他的六种),具体可以再百度。
insert* 是执行insert开头(因为你后面跟了*)的方法时的事物如何处理。
手敲的原创回答,你找不到其他出处的。