Spring中如何配置Hibernate事務

jopen 11年前發布 | 67K 次閱讀 Spring JEE框架

         為了保證數據的一致性,在編程的時候往往需要引入事務這個概念。事務有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、第一種配置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></pre><br />

         至此Hibernate就成功的將SessionFactory交給了Spring來管理。現在再來看Spring是怎樣管理Hibernate事務的吧。

         第一種方式,利用tx標簽配置事務。

 <!-- 配置事務容器 -->
    <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>

         第二種,用代理進行配置

 <!-- 配置事務容器 -->
    <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>

         第三種,利用攔截器

 <!-- 配置事務容器 -->
    <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>

         第四種,利用注解。

         首先,在配置文件中寫入下面語句,打開注解功能

 <!-- 開戶事務注解功能 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

         然后用@Transactional對類或者方法進行標記,如果標記到類上,那么次類中所有方法都進行事務回滾處理,在類中定義Transactional的時候,它有propagation、rollbackFor、noRollbackFor等屬性,此屬性是用來定義事務規則,而定義到哪這個就是事務入口。

         縱觀以上四種在Spring中配置Hibernate事務的方法,其核心都是一樣的,不同的只是實現的方式而已。所以看到這,這篇博文中你只需要記住4句話,就可以輕松理解在Spring中配置Hibernate事務的核心:

         1.配置SessionFactory

         2.配置事務容器

         3.配置事務規則

         4.配置事務入口


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!