`
35687638
  • 浏览: 9957 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

struts+hibernate+spring事务配置

    博客分类:
  • SSH
阅读更多
原创作者: 吴振中   阅读:3874次   评论:1条   更新时间:2009-04-28    Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:

1、  准备工作:

可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现

关键就在于配置文件,下面看一个样例app.xml:

<?xml version="1.0" encoding="utf-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

<!--配置数据源-->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

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

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

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

       <property name="jdbcUrl" value="jdbc:mysql://localhost/auction"/>

       <!-- 指定连接数据库的用户名 -->

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

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

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

       <!-- 指定连接数据库连接池的最大连接数 -->

       <property name="maxPoolSize" value="20"/>

       <!-- 指定连接数据库连接池的最小连接数 -->

       <property name="minPoolSize" value="1"/>

       <!-- 指定连接数据库连接池的初始化连接数 -->

       <property name="initialPoolSize" value="1"/>

       <!-- 指定连接数据库连接池的连接的最大空闲时间 -->

       <property name="maxIdleTime" value="20"/>

    </bean>

  

    <!--配置数据库会话工厂-->

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

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

       <property name="mappingResources">

           <list>

              <value>com/ouya/User.hbm.xml</value>

           </list>

       </property>

        <property name="hibernateProperties">

    <props>

     <prop key="hibernate.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="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

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

</bean>

    <!—-配置Spring 事务管理器代理 -->

<bean id="transactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="transactionManager">

         <ref local="transactionManager"/>

    </property>

    <property name="transactionAttributes">

         <props>

          <prop key="save*">PROPAGATION_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>

           <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="remove*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="count*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

    </props>

   </property>

    </bean>

    <!-- Hibernate模板 -->

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

   <property name="sessionFactory">

    <ref local="sessionFactory" />

   </property>

</bean>

    <!--服务层对象-->

    <bean id="us" class="com.ouya.UserService">

     <property name="userDao">

      <ref local="userDao"/>

     </property>

    </bean>

    <!-- spring代理用户服务对象 -->

<bean id="userService" parent="transactionProxyFactory">

<!-- 如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常 -->

<!--<property name="proxyTargetClass" value="true"/>-->

       <property name="target" ref="us"/>

</bean>

    <!-- 用户数据访问对象DATA ACCESS OBJECT -->

<bean id="userDao" class="com.ouya.UserDAO">

   <property name="hibernateTemplate" ref="hibernateTemplate"/>

</bean>

    </beans>

可以看到配置文件的步骤:

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、  增加一个事务拦截器

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

    <property name="transactionManager">

         <ref local="transactionManager"/>

    </property>

    <property name="transactionAttributes">

         <props>

          <prop key="save*">PROPAGATION_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>

           <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="remove*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="count*">PROPAGATION_REQUIRED,readOnly</prop>

           <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

    </props>

   </property>

</bean>

2、  定义自动代理事务管理器

<!-- 定义BeanNameAutoProxyCreator-->

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<!--  如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true -->

<!--<property name="proxyTargetClass" value="true"-->

        <!--  指定对满足哪些bean name的bean自动生成业务代理 -->

        <property name="beanNames">

            <!--  下面是所有需要自动创建事务代理的bean-->

            <list>

                <value>us</value>

            </list>

            <!--  此处可增加其他需要自动创建事务代理的bean-->

        </property>

        <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->

        <property name="interceptorNames">

            <list>

                <!-- 此处可增加其他新的Interceptor -->

                <value>transactionInterceptor</value>

            </list>

        </property>

</bean>

然后我们在程序中调用时应如下:

UserService us = (UserService) app.getBean("us");

注:注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是

BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在



附录:

1、关于hibernate的属性详解:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

<!-- 以下配置都是使用 jdbc.properties 属性文件中的配置,而之所以可以这样写,就是因为有 属性占位符配置的原因 -->

<property name="driverClass" value="${jdbc.driverClassName}"/>

<property name="jdbcUrl" value="${jdbc.url}"/>

<property name="user" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

<!-- 连接池维持的最小的连接个数 -->

<property name="minPoolSize" value="5"/>

<!-- 连接池维持的最大的连接个数 -->

<property name="maxPoolSize" value="20"/>

<!-- 最大空闲时间, 当某个连接在这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数: minPoolSize -->

<property name="maxIdleTime" value="1800"/>

<!-- 为加强准备语句的执行性能,此参数指定被缓存的 PreparedStatement 的个数 -->

<property name="maxStatements" value="50"/>

</bean>



Hibernate 会话厂 SessionFactory

Session 就是用于每次与数据库会话的,因此需要:

数据库的配置参数,这些参数就是 上面的数据源指定的! 因此我们只需引用即可: ref="dataSource";

实体映射配置 hibernate.cfg.xml 配置

结果缓存配置(这里使用的是开源的 ehcache)



<!-- Hibernate SessionFactory -->

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

<!-- 引用前面定义的数据源 -->

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

<!-- 所有实体映射文件列表, 所有的 hbm.xml 文件 -->

<property name="mappingResources">

<list>

<value>org/springframework/samples/jpetstore/domain/Account.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Banner.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Category.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Inventory.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Item.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/LineItem.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Order.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Product.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Supplier.hbm.xml</value>

</list>

</property>

<!-- 传统上的 hibernate.cfg.xml 文件的参数放在这里 -->

<property name="hibernateProperties">

<props>

<!-- 指定数据库方言 -->

<prop key="hibernate.dialect">${hibernate.dialect}

</prop>

<!-- 是否在日志中输出所有Hibernate与数据库交互的SQL语句 -->

<prop key="hibernate.show_sql">true</prop>

<!-- 是否在日志中输出的SQL 语句格式化成易读形式 -->

<prop key="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读取数据的时候每次从数据库中取出的记录条数,一般设置为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_size参数只是设定一次最多可以提交多少sql语句的上限,提高sql语句的执行效率

-->

<prop key="hibernate.jdbc.batch_size">50</prop>

<!--

(1)create 在每次SesstionFactory 构建时(一般是应用重启时,或者伴随着应用服务器重启时),先将之前数据库中的所有数据全

部清空,后紧跟着根据所有的hbm.xml 映射文件重新创建新的数据库表



(2)create-drop 除了create 的所有含义之外,在每次应用的退出前,将进行一次数据空清空。因此这个配置将有两次清空操作,

一次是退出,一次是启动时。



(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()等方法获得的数据结果集的话,就需要设置

hibernate.cache.use_query_cache true 才行- 在Hbm文件中添加<cache usage="read-only"/>-

如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性-->

<prop key="hibernate.cache.use_query_cache">true</prop>

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>

</props>

</property>

<!-- 为解决 merge()方法语义的歧义 @todo 以后进一步解析或者你可以看一下相应的文档 -->

<property name="eventListeners">

<map><entry key="merge">

<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>

</entry></map>

</property>

</bean>



2、Spring的transactionAttributes



PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
分享到:
评论

相关推荐

    struts+hibernate+spring事务配置_花粉册.rar

    本文将详细讲解如何在这样的MVC架构中进行事务配置,结合"struts+hibernate+spring事务配置_花粉册.htm"和相关文件,我们将深入探讨事务管理的重要性以及具体配置步骤。 首先,理解事务是非常关键的。在数据库操作...

    基于struts+hibernate+spring的用户管理系统

    总结来说,这个用户管理系统展示了如何利用Struts进行请求调度和视图控制,Hibernate进行数据持久化,以及Spring进行组件管理和事务处理。通过这三个框架的协作,系统能够有效地组织和处理复杂的业务逻辑,同时也...

    图书管理系统spring+struts+hibernate

    《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、Struts和Hibernate。该系统利用MySQL作为数据库存储数据,提供了完整的数据库备份,确保了数据的安全性与...

    王者归来之JAVA程序开发大全:基于MYECLIPSE平台+STRUTS+HIBERNATE+SPRING主体流框架开发.pdf

    《王者归来之JAVA程序开发大全:基于MYECLIPSE平台+STRUTS+HIBERNATE+SPRING主体流框架开发》这本书是为Java开发者提供的一份全面指南,尤其适合那些希望深入理解并掌握企业级Java应用开发的读者。本书以MyEclipse...

    JSP源码——车辆管理系统(struts+hibernate+spring+oracle).zip

    在车辆管理系统中,Spring管理着所有bean的生命周期,包括Struts的Action、Hibernate的SessionFactory等,还可能包含了事务管理,确保数据操作的一致性。 Oracle数据库是这个系统的数据存储中心,它提供了高性能、...

    基于Struts 2+Hibernate+Spring实现论坛系统

    Struts 2、Hibernate 和 Spring 是 Java Web 开发中的三个重要框架,它们组合起来可以构建高效、可维护的Web应用程序,尤其是对于复杂的企业级论坛系统。这个基于Struts 2+Hibernate+Spring实现的论坛系统,充分利用...

    struts+hibernate+spring源码

    通过源码学习,可以理解它们是如何协同工作的,例如,Spring如何通过AOP代理实现在Struts Action调用前后执行特定逻辑,以及如何配置和管理Hibernate SessionFactory。 **源码学习价值:** 1. **提升理解力**:源码...

    struts+hibernate+spring新闻系统

    启动服务器后,系统会自动解压WAR文件,并根据配置文件加载Struts 2的配置、Spring的上下文以及Hibernate的映射文件。系统启动后,用户可以通过浏览器访问指定URL,查看和操作新闻系统。 **功能特性** 这个新闻系统...

    Struts+hibernate+spring学习实例

    7. 整合配置:在struts-config.xml、hibernate.cfg.xml和Spring的配置文件(如applicationContext.xml)中,正确配置各个组件,使它们能协同工作。 8. 错误和异常处理:设计合适的错误页面和异常处理器,处理可能...

    基于Struts2+hibernate+spring 注解开发的学生信息管理系统

    【SSH 注解开发】是Java Web开发中一种常见的技术栈组合,由Struts2、Hibernate和Spring框架共同构建。这个学生信息管理系统就是基于这种技术栈,利用注解的方式来简化配置,提高开发效率。 Struts2作为MVC(模型-...

    图书管理系统(struts+hibernate+spring)

    2. **资源文件**:如配置文件(struts-config.xml, spring-context.xml, hibernate.cfg.xml),JDBC驱动,以及其他静态资源。 3. **Web-INF**:存放web.xml文件,定义了Servlet容器的配置,以及Struts的配置。 4. **...

    JAVA WEB整合开发实例精通:Struts+Hibernate+Spring

    《JAVA WEB整合开发实例精通:Struts+Hibernate+Spring》这本书深入探讨了Java Web开发中的核心技术,特别是如何将三大框架Struts、Hibernate和Spring集成在一起,以构建高效、灵活的企业级应用。以下是对这些框架...

    在线音乐网站(Struts2+hibernate+spring)

    【标题】"在线音乐网站(Struts2+hibernate+spring)" 是一个基于Java技术栈构建的Web应用程序,旨在提供音乐流媒体服务。这个项目整合了三个关键的开源框架:Struts2、Hibernate和Spring,它们在Java Web开发中扮演...

    Struts2+Hibernate+Spring课件 张志峰版

    Struts2、Hibernate和Spring是Java企业级开发中三大核心框架,它们的组合通常被称为SSH(Struts2、Spring、Hibernate)集成框架。这个“Struts2+Hibernate+Spring课件 张志峰版”提供了深入学习这三大框架的宝贵资源...

    struts+spring+hibernate实现图书修改和删除

    SSH整合的关键在于配置文件,包括Struts 2的struts.xml、Spring的applicationContext.xml和Hibernate的hibernate.cfg.xml。这些文件定义了各组件之间的关系和行为。例如,struts.xml中配置Action类及其结果视图,...

    整合struts+hibernate+spring应用开发详解 part1

    第四章则可能涉及Struts的使用,如Action类的编写、ActionForm和Result的配置,以及如何将Struts与Hibernate和Spring进行整合。 通过学习这个系列,开发者可以掌握这三个框架的核心概念和整合技巧,提升开发大型、...

    当当网struts+hibernate+spring

    Struts、Hibernate和Spring是Java Web开发中的三大框架,它们的组合使用,即SSH(Struts2、Hibernate4、Spring4),在企业级应用中非常常见。这个名为"当当网struts+hibernate+spring"的项目,显然旨在模拟和学习...

    基于Struts2+Spring+Hibernate+MySql的注册登录系统.zip

    Struts2处理请求,Spring管理组件和事务,Hibernate负责数据持久化,而MySql存储数据。EhCache的加入提升了系统的性能,降低了数据库的压力。理解并掌握这些技术,对于开发高效、稳定的Web应用具有重要意义。

Global site tag (gtag.js) - Google Analytics