S详细讲解SH中Spring事务流程_第1页
S详细讲解SH中Spring事务流程_第2页
S详细讲解SH中Spring事务流程_第3页
S详细讲解SH中Spring事务流程_第4页
S详细讲解SH中Spring事务流程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、给你详细讲一下 SSH 框架的事物管理,希望对你有帮助。Struts+hibernate+spring 整合开发 web 应用是相当流行的,只需要简单的配置 就能轻松的对数据库进行 crud 操作,下面就 hibernate spring 的配置做一下剖 析,一边与大家一起分享经验:1、准备工作:</property><property name="hibernateProperties"><props>可以利用 hibernate tools 生成相关映射文件已经 po 对象、 dao 对象, dao 也可 以自己手动编写,无非就是实现

2、 crud ,如果通过继承 hibernate 提供的 HibernateDaoSupport, 则可以更轻松的实现 关键就在于配置文件,下面看一个样例 app.xml :<?xml version="1.0" encoding="utf-8"?> <beans xmlns=" "xmlns:xsi=" " xsi:schemaLocation=" "><!-配置数据源 -> <bean id="dataSource"class=&q

3、uot;com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><!- 指定连接数据库的驱动 -> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!- 指定连接数据库的 URL -> <property name="jdbcUrl" value="jdbc:mysql:/localhost/auct

4、ion"/> <!- 指定连接数据库的用户名 -><!- 指定连接数据库的密码 -><property name="password" value="root"/> <!- 指定连接数据库连接池的最大连接数 -> <property name="maxPoolSize" value="20"/> <!- 指定连接数据库连接池的最小连接数 -> <property name="minPoolSize" v

5、alue="1"/> <!- 指定连接数据库连接池的初始化连接数 -> <property name="initialPoolSize" value="1"/> <!- 指定连接数据库连接池的连接的最大空闲时间 -> <property name="maxIdleTime" value="20"/></bean><!-配置数据库会话工厂 -><bean id="sessionFactory"c

6、lass="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/> <property name="mappingResources"><list><value>com/ouya/User.hbm.xml</value></list><propkey="hiberna

7、te.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.cglib.use_reflection_optimizer">true</prop></props></property></bean><!-配置事务管理器 -> <bean id="t

8、ransactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><reflocal="sessionFactory"/></property> </bean><!- 配置 Spring 事务管理器代理 -> <bean id="transactionProxyFacto

9、ry" abstract="true" lazy-init="true"class="erceptor.TransactionProxyFactoryB ean"><property name="transactionManager"><ref local="transactionManager"/><prop key="save*">PROPAGATIO

10、N_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop> <p

11、ropkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop>

12、<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><!- Hibernate 模板 -> &l

13、t;bean id="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory"><ref local="sessionFactory" /></property> </bean><!- 服务层对象 -><bean id="us" class="com.o

14、uya.UserService"><property name="userDao"><ref local="userDao"/></property></bean><!- spring 代理用户服务对象 -> <bean id="userService" parent="transactionProxyFactory"><!- 如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass 为true ,否

15、则会报 classcast 异常 -> <!-<property name="proxyTargetClass" value="true"/>-><property name="target" ref="us"/></bean><!- 用户数据访问对象 DATA ACCESS OBJECT -> <bean id="userDao" class="com.ouya.UserDAO"></bea

16、n></beans>可以看到配置文件的步骤:<property name="hibernateTemplate" ref="hibernateTemplate"/>2、1、 配置数据源配置会话工厂(依赖注入上面的数据源,还要注入hbm 映射文件 注意正确的位置 、hibernate 属性文件)3、配置事务管理器(依赖注入上面的会话工厂)<property name="transactionManager">4、 Spring 中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面 的事务管

17、理器,此外还需要配置 transationAttributes ) 后面的一些普通的 bean 配置就不用说了上面的例子中使用的声明事务管理器是: TransactionProxyFactoryBean, 这样的 话我们就需要在后面配置目标 bean,比如上面的例子中我们的原服务对象是id为 us 的 UserService (没有实现接口) ,所以我们为他配置了 id 为 userService 的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据 库操作功能(代理对象的父类是上面声明的事务管理器, 一边我们使用的时候开 启事务),如果直接使用服务对象就无法开启事务 程序

18、中调用: UserService us = (UserService) app.getBean("userService");注:userService就是上面配置的代理对象的id,而不是原服务对象的id但是如果我们想通过原服务对象的 id 来使用对象,则我们需要使用代理事务管 理器 BeanNameAutoProxyCreator (根据 beanname 自动代理),上面的配置 文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean ,不然就混乱了,可能会报错的):1、增加一个事务拦截器<bean id="

19、transactionInterceptor"class="erceptor.TransactionInterceptor"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save*">PROPAGATION_REQU

20、IRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop> <propkey

21、="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><pr

22、op key="list*">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></bean>2、定义自动代理事务管理器</property><!- 定义 BeanNameAut

23、oProxyCreator-><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyC reator"><!- 如果服务层对象是接口实现类, 则需要设置 proxyTargetClass 属性为 true-> <!-<property name="proxyTargetClass" value="true"-><!- 指定对满足哪些 bean name 的 bean 自动生成业务代理 -&g

24、t; <property name="beanNames"><!- 下面是所有需要自动创建事务代理的 bean-><list><value>us</value></list> <!- 此处可增加其他需要自动创建事务代理的 bean-></property> <!- 下面定义 BeanNameAutoProxyCreator 所需的事务拦截器 -> <property name="interceptorNames"><list>

25、;<!- 此处可增加其他新的 Interceptor -><value>transactionInterceptor</value></list></bean></property>然后我们在程序中调用时应如下:UserService us = (UserService) app.getBean("us");注:注意与上面使用 TransactionProxyFactoryBean 时的调用区别, 此处我们用 getbean 时直接取原服务层对象的 id ,不需要去配置目标 bea, 这也正是BeanN

26、ameAutoProxyCreator( 根据 bean 名称自动代理 )的含义所在附录:1、关于 hibernate 的属性详解:<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"> <!- 以下配置都是使用 perties 属性文件中的配置,而之所以可以这样 写,就是因为有 属性占位符配置的原因 -> <property name="drive

27、rClass" value="$jdbc.driverClassName"/> <property name="jdbcUrl" value="$jdbc.url"/> <property name="user" value="$jdbc.username"/> <property name="password" value="$jdbc.password"/><!- 连接池维持的最大的连接个数 -

28、><property name="maxPoolSize" value="20"/> <!- 最大空闲时间 , 当某个连接在这个时间内没活动后将从池中移除, 前提是池 中至少多于最少的连接数 : minPoolSize -> <property name="maxIdleTime" value="1800"/> <!- 为加强准备语句的执行性能,此参数指定被缓存的 PreparedStatement 的 个数 -> <property name="

29、;maxStatements" value="50"/> </bean>Hibernate 会话厂 SessionFactorySession 就是用于每次与数据库会话的,因此需要: 数据库的配置参数,这些参数就是 上面的数据源指定的 ! 因此我们只需引用即 可: ref="dataSource" ; 实体映射配置 hibernate.cfg.xml 配置 结果缓存配置 (这里使用的是开源的 ehcache)<!- Hibernate SessionFactory -> <bean id="sess

30、ionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!- 引用前面定义的数据源 -><property name="dataSource" ref="dataSource"/><!- 所有实体映射文件列表 , 所有的 hbm.xml 文件 -><property name="mappingResources"><list> <v

31、alue>org/springframework/samples/jpetstore/domain/Account.hbm.xml</val ue> <value>org/springframework/samples/jpetstore/domain/Banner.hbm.xml</valu e> <value>org/springframework/samples/jpetstore/domain/Category.hbm.xml</v alue> <value>org/springframework/sampl

32、es/jpetstore/domain/Inventory.hbm.xml</v alue> <value>org/springframework/samples/jpetstore/domain/Item.hbm.xml</value> <value>org/springframework/samples/jpetstore/domain/LineItem.hbm.xml</va lue> <value>org/springframework/samples/jpetstore/domain/Order.hbm.xml&

33、lt;/value> <value>org/springframework/samples/jpetstore/domain/Product.hbm.xml</val ue> <value>org/springframework/samples/jpetstore/domain/Supplier.hbm.xml</val ue> </list> </property> <!- 传统上的 hibernate.cfg.xml 文件的参数放在这里 -> <property name="hiber

34、nateProperties"> <props><prop key="hibernate.dialect">$hibernate.dialect<!- 指定数据库方言 -></prop><!- 是否在日志中输出所有 Hibernate 与数据库交互的SQL 语句 -><prop key="hibernate.show_sql">true</prop><!- 是否在日志中输出的 SQL 语句格式化成易读形式-><prop key="

35、;hibernate.format_sql">true</prop><!- 是否显示统计形式,一般在测试阶段使用-><prop key="hibernate.generate_statistics">true</prop><!- 对于级联查询,一次性获取的级联深度,todo需进一步研究 -><prop key="hibernate.max_fetch_depth">2</prop><!-Fetch Size 是设定 JDBC 的 Statement

36、读取数据的时候每次从数据库中取出的 记录条数,一般设置为 30、50、100。Oracle 数据库的 JDBC 驱动默认的 Fetch Size=15 ,设置 Fetch Size 设置为: 30、50,性能会有明显提升,如果继续增大,超出 100 ,性能提升不明显,反而会消耗内存。-><prop key="hibernate.jdbc.fatch_size">100</prop><!-不必等到累计到50个SQL之后才执行.只要事务commit后,不管缓存中有多少 条 sql 语句都要执行 .hibernate.jdbc.batch_si

37、ze 参数只是设定一次最多可以提交多少 sql 语句的上限 , 提高 sql 语句的执行效率-><prop key="hibernate.jdbc.batch_size">50</prop> <!- (1)create 在每次 SesstionFactory 构建时 (一般是应用重启时, 或者伴随着应用 服务器重启时 ),先将之前数据库中的所有数据全部清空,后紧跟着根据所有的 hbm.xml 映射文件重新创建新的数据库表(2)create-drop 除了 create 的所有含义之外,在每次应用的退出前,将进行 次数据空清空。因此这个配置

38、将有两次清空操作, 一次是退出,一次是启动时。(3)update如果在开发阶段理发了实体对象的映射文件 (hbm.xml) 的定义后,此配置将后台 的数据库表进行更新 (如增加表的列 )(4)validate用于校验现有的表与现有的配置是否一致。-> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 见下面的解释 -> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 结果缓存配置: - 将 ehcache.xml 置于 classpath 中- 如果不设置 “查询缓 存”, 那么 hibernate 只会缓存使用 load() 方法获得的单个持久化对象,如果想缓存使 用 findall() 、 list() 、Iterator() 、createCriteria() 、 createQuery() 等方法获得的数据结果集的话,就需 要设置hibern

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论