Spring中如何配置Hibernate事务

         为了保证数据的一致性,在编程的时候往往需要引入事务这个概念。事务有4个特性:原子性、一致性、隔离性、持久性。

         事务的种类有两种:编程式事务和声明式事务。编程式事务就是将事务处理放在程序中,而声明式事务则是通过配置文件或者注解进行操作。

         在spring中有声明式事务的概念,通过和hibernate类似框架的集成,可以很好的完成声明式事务。

         其实,不论在Spring中有几种配置Hibernate事务的方法,都逃不出一下几条:

         1.配置SessionFactory

         2.配置事务容器

         3.配置事务规则

         4.配置事务入口

         后面一共为大家提供4种配置Hibernate事务的方法。

         首先说下配置SessionFactory,配置SessionFactory有两种方式,一种是通过配置hibernate.cfg.xml文件的位置来配置SessionFactory,另一种就是在Spring配置文件中,手动配置数据源。

         下面是两种配置SessionFactory的方式(第二种配置需要额外引入两个包:commons-dbcp、commons-pool)

  1. <!– 1、第一种配置SessionFactory的方式 –>  
  2. <bean id=“sessionFactory”  
  3.     class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>  
  4.     <property name=“configLocation” value=“classpath:hibernate.cfg.xml” />  
  5. </bean>  
  6.   
  7. <!– 2、第二种配置SessionFactory的方式 –>  
  8. <!– 2.1配置数据源 –>  
  9. <bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource”  
  10.     destroy-method=“close”>  
  11.     <property name=“driverClassName” value=“com.mysql.jdbc.Driver”></property>  
  12.     <property name=“url” value=“jdbc:mysql://localhost:3306/hibernate_cache”></property>  
  13.     <property name=“username” value=“root”></property>  
  14.     <property name=“password” value=“admin”></property>  
  15. </bean>  
  16. <!– 2.2、配置SessionFactory –>  
  17. <bean id=“sessionFactory”  
  18.     class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>  
  19.     <property name=“dataSource” ref=“dataSource”></property>  
  20.     <property name=“hibernateProperties”>  
  21.         <props>  
  22.             <prop key=“hibernate.hbm2ddl.auto”>update</prop>  
  23.         </props>  
  24.     </property>  
  25.     <property name=“mappingLocations”>  
  26.         <list>  
  27.             <value>classpath:实体对应xml的路径</value>  
  28.         </list>  
  29.     </property>  
  30. </bean>  
  <!-- 1、第一种配置SessionFactory的方式 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>

    <!-- 2、第二种配置SessionFactory的方式 -->
    <!-- 2.1配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/hibernate_cache"></property>
        <property name="username" value="root"></property>
        <property name="password" value="admin"></property>
    </bean>
    <!-- 2.2、配置SessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="mappingLocations">
            <list>
                <value>classpath:实体对应xml的路径</value>
            </list>
        </property>
    </bean>

         至此Hibernate就成功的将SessionFactory交给了Spring来管理。现在再来看Spring是怎样管理Hibernate事务的吧。

         第一种方式,利用tx标签配置事务。

  1. <!– 配置事务容器 –>  
  2. <bean id=“transactionManager”  
  3.     class=“org.springframework.orm.hibernate3.HibernateTransactionManager”>  
  4.     <property name=“sessionFactory” ref=“sessionFactory” />  
  5. </bean>  
  6. <!– 定义事务规则 –>  
  7. <tx:advice id=“txAdvice” transaction-manager=“transactionManager”>  
  8.     <tx:attributes>  
  9.         <tx:method name=“add*” propagation=“REQUIRED” />  
  10.         <tx:method name=“modify*” propagation=“REQUIRED” />  
  11.         <tx:method name=“del*” propagation=“REQUIRED” />  
  12.         <tx:method name=“*” propagation=“REQUIRED” read-only=“true” />  
  13.     </tx:attributes>  
  14. </tx:advice>  
  15. <!– 定义事务入口 –>  
  16. <aop:config>  
  17.     <aop:pointcut id=“allDaoMethod” expression=“execution(* com.jianxin.dao.*.*(..))” />  
  18.     <aop:advisor advice-ref=“txAdvice” pointcut-ref=“allDaoMethod” />  
  19. </aop:config>  
  <!-- 配置事务容器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 定义事务规则 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" />
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 定义事务入口 -->
    <aop:config>
        <aop:pointcut id="allDaoMethod" expression="execution(* com.jianxin.dao.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allDaoMethod" />
    </aop:config>

         第二种,用代理进行配置

  1. <!– 配置事务容器 –>  
  2. <bean id=“transactionManager”  
  3.     class=“org.springframework.orm.hibernate3.HibernateTransactionManager”>  
  4.     <property name=“sessionFactory” ref=“sessionFactory” />  
  5. </bean>  
  6. <!– 定义事务规则 –>  
  7. <bean id=“transactionProxy”  
  8.     class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean”  
  9.     abstract=“true”>  
  10.     <property name=“transactionManager” ref=“transactionManager” />  
  11.     <property name=“transactionAttributes”>  
  12.         <props>  
  13.             <!– ,回滚为-,不回滚为+ –>  
  14.             <prop key=“add*”>PROPAGATION_REQUIRED,-Exception</prop>  
  15.             <prop key=“modify*”>PROPAGATION_REQUIRED,+MyException</prop>  
  16.             <prop key=“del*”>PROPAGATION_REQUIRED</prop>  
  17.             <prop key=“*”>READONLY</prop>  
  18.         </props>  
  19.     </property>  
  20. </bean>  
  21. <!– 定义事务入口 –>  
  22. <bean id=“userDaoProxy” parent=“transactionProxy”>  
  23.     <property name=“target” ref=“userDao”></property>  
  24. </bean>  
   <!-- 配置事务容器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 定义事务规则 -->
    <bean id="transactionProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        abstract="true">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <!-- ,回滚为-,不回滚为+ -->
                <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
                <prop key="modify*">PROPAGATION_REQUIRED,+MyException</prop>
                <prop key="del*">PROPAGATION_REQUIRED</prop>
                <prop key="*">READONLY</prop>
            </props>
        </property>
    </bean>
    <!-- 定义事务入口 -->
    <bean id="userDaoProxy" parent="transactionProxy">
        <property name="target" ref="userDao"></property>
    </bean>

         第三种,利用拦截器

  1. <!– 配置事务容器 –>  
  2. <bean id=“transactionManager”  
  3.     class=“org.springframework.orm.hibernate3.HibernateTransactionManager”>  
  4.     <property name=“sessionFactory” ref=“sessionFactory” />  
  5. </bean>  
  6. <!– 定义事务规则 –>  
  7. <bean id=“transactionInterceptor”  
  8.     class=“org.springframework.transaction.interceptor.TransactionInterceptor”>  
  9.     <property name=“transactionManager” ref=“transactionManager” />  
  10.     <property name=“transactionAttributes”>  
  11.         <props>  
  12.             <!– 回滚为-,不回滚为+ –>  
  13.             <prop key=“add*”>PROPAGATION_REQUIRED,-Exception</prop>  
  14.             <prop key=“modify*”>PROPAGATION_REQUIRED,+MyException</prop>  
  15.             <prop key=“del*”>PROPAGATION_REQUIRED</prop>  
  16.             <prop key=“*”>READONLY</prop>  
  17.         </props>  
  18.     </property>  
  19. </bean>  
  20. <!– 定义事务入口 –>  
  21. <bean id=“proxyFactory”  
  22.     class=“org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>  
  23.     <property name=“interceptorNames”>  
  24.         <list>  
  25.             <value>transactionInterceptor</value>  
  26.         </list>  
  27.     </property>  
  28.     <property name=“beanNames”>  
  29.         <list>  
  30.             <value>*Dao</value>  
  31.         </list>  
  32.     </property>  
  33. </bean>  
  <!-- 配置事务容器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 定义事务规则 -->
    <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <!-- 回滚为-,不回滚为+ -->
                <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
                <prop key="modify*">PROPAGATION_REQUIRED,+MyException</prop>
                <prop key="del*">PROPAGATION_REQUIRED</prop>
                <prop key="*">READONLY</prop>
            </props>
        </property>
    </bean>
    <!-- 定义事务入口 -->
    <bean id="proxyFactory"
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
        <property name="beanNames">
            <list>
                <value>*Dao</value>
            </list>
        </property>
    </bean>

         第四种,利用注解。

         首先,在配置文件中写入下面语句,打开注解功能

  1. <!– 开户事务注解功能 –>  
  2. <tx:annotation-driven transaction-manager=“transactionManager” />  
    <!-- 开户事务注解功能 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

         然后用@Transactional对类或者方法进行标记,如果标记到类上,那么次类中所有方法都进行事务回滚处理,在类中定义Transactional的时候,它有propagation、rollbackFor、noRollbackFor等属性,此属性是用来定义事务规则,而定义到哪这个就是事务入口。

         纵观以上四种在Spring中配置Hibernate事务的方法,其核心都是一样的,不同的只是实现的方式而已。所以看到这,这篇博文中你只需要记住4句话,就可以轻松理解在Spring中配置Hibernate事务的核心:

         1.配置SessionFactory

         2.配置事务容器

         3.配置事务规则

         4.配置事务入口


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页