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、第一種配置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.配置事務入口