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>
至此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.配置事務入口
相關文章
- 說說在 Spring 中,如何基於 XML 來配置事務SpringXML
- Spring框架中配置事務管理器Spring框架
- spring宣告式事務管理配置Spring
- Spring事務配置的五種方式Spring
- Spring 中的事務管理Spring
- 五(二)、spring 宣告式事務xml配置SpringXML
- Spring事務專題(四)Spring中事務的使用、抽象機制及模擬Spring事務實現Spring抽象
- Spring中的事務提交事件Spring事件
- Spring中@Transactional事務使用陷阱Spring
- Spring Data JPA中事務ReactiveTransactionManagerSpringReact
- (四)Spring中的事務管理Spring
- Spring事務專題(五)聊聊Spring事務到底是如何實現的Spring
- Spring 事務Spring
- spring事務Spring
- Spring AOP及事務配置三種模式詳解Spring模式
- spring基於註解配置實現事務控制Spring
- java中Hibernate的環境配置Java
- spring事務管理原始碼分析(一)配置和事務增強代理的生成流程Spring原始碼
- Spring 整合 HibernateSpring
- 說說在 Spring 中,如何程式設計實現事務管理Spring程式設計
- Spring 事務管理Spring
- Spring Boo中事務感知快取示例Spring快取
- Spring中事務管理org.springframework.transactionSpringFramework
- Spring Data JPA中事務超時TransactionTimedOutExceptionSpringException
- 分散式事務之Spring事務與JMS事務(二)分散式Spring
- Hibernate配置OracleOracle
- 事務使用中如何避免誤用分散式事務分散式
- 解析Spring Boot中的事務管理機制Spring Boot
- Spring Data JPA中事務監聽器TransactionExecutionListenerSpring
- Spring Data JPA中事務使用異常TransactionUsageExceptionSpringException
- Spring Data JPA中事務回滾意外RollbackExceptionSpringException
- spring-5-事務Spring
- Spring Webflux與事務SpringWebUX
- Spring系列.事務管理Spring
- Spring事務筆記Spring筆記
- Spring系列-事務管理Spring
- Spring的事務管理Spring
- Spring-AOP事務Spring