Hibernate事務的幾種配置方式
阿新 • • 發佈:2019-02-13
為了保證資料的一致性,在程式設計的時候往往需要引入事務這個概念。事務有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的方式 --> <beanid="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/> </bean> <!-- 2、第二種配置SessionFactory的方式 --> <!-- 2.1配置資料來源 --> <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <propertyname="driverClassName"value="com.mysql.jdbc.Driver"></property> <propertyname="url"value="jdbc:mysql://localhost:3306/hibernate_cache"></property> <propertyname="username"value="root"></property> <propertyname="password"value="admin"></property> </bean> <!-- 2.2、配置SessionFactory --> <beanid="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propertyname="dataSource"ref="dataSource"></property> <propertyname="hibernateProperties"> <props> <propkey="hibernate.hbm2ddl.auto">update</prop> </props> </property> <propertyname="mappingLocations"> <list> <value>classpath:實體對應xml的路徑</value> </list> </property> </bean> 至此Hibernate就成功的將SessionFactory交給了Spring來管理。現在再來看Spring是怎樣管理Hibernate事務的吧。 第一種方式,利用tx標籤配置事務。 <!-- 配置事務容器 --> <beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <propertyname="sessionFactory"ref="sessionFactory"/> </bean> <!-- 定義事務規則 --> <tx:adviceid="txAdvice"transaction-manager="transactionManager"> <tx:attributes> <tx:methodname="add*"propagation="REQUIRED"/> <tx:methodname="modify*"propagation="REQUIRED"/> <tx:methodname="del*"propagation="REQUIRED"/> <tx:methodname="*"propagation="REQUIRED"read-only="true"/> </tx:attributes> </tx:advice> <!-- 定義事務入口 --> <aop:config> <aop:pointcutid="allDaoMethod"expression="execution(* com.jianxin.dao.*.*(..))" /> <aop:advisoradvice-ref="txAdvice"pointcut-ref="allDaoMethod"/> </aop:config> 第二種,用代理進行配置 <!-- 配置事務容器 --> <beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <propertyname="sessionFactory"ref="sessionFactory"/> </bean> <!-- 定義事務規則 --> <beanid="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <propertyname="transactionManager"ref="transactionManager"/> <propertyname="transactionAttributes"> <props> <!-- ,回滾為-,不回滾為+ --> <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop> <propkey="modify*">PROPAGATION_REQUIRED,+MyException</prop> <propkey="del*">PROPAGATION_REQUIRED</prop> <propkey="*">READONLY</prop> </props> </property> </bean> <!-- 定義事務入口 --> <beanid="userDaoProxy"parent="transactionProxy"> <propertyname="target"ref="userDao"></property> </bean> 第三種,利用攔截器 <!-- 配置事務容器 --> <beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <propertyname="sessionFactory"ref="sessionFactory"/> </bean> <!-- 定義事務規則 --> <beanid="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <propertyname="transactionManager"ref="transactionManager"/> <propertyname="transactionAttributes"> <props> <!-- 回滾為-,不回滾為+ --> <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop> <propkey="modify*">PROPAGATION_REQUIRED,+MyException</prop> <propkey="del*">PROPAGATION_REQUIRED</prop> <propkey="*">READONLY</prop> </props> </property> </bean> <!-- 定義事務入口 --> <beanid="proxyFactory" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <propertyname="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> <propertyname="beanNames"> <list> <value>*Dao</value> </list> </property> <!--使用介面時--> <property name="proxyTargetClass"> <value>true</value> </property> </bean> 第四種,利用註解。 <!-- 開戶事務註解功能 --> <tx:annotation-driventransaction-manager="transactionManager"/> 首先,在配置檔案中寫入下面語句,開啟註解功能 然後用@Transactional對類或者方法進行標記,如果標記到類上,那麼次類中所有方法都進行事務回滾處理,在類中定義Transactional的時候,它有propagation、rollbackFor、noRollbackFor等屬性,此屬性是用來定義事務規則,而定義到哪這個就是事務入口。 縱觀以上四種在Spring中配置Hibernate事務的方法,其核心都是一樣的,不同的只是實現的方式而已。所以看到這,這篇博文中你只需要記住4句話,就可以輕鬆理解在Spring中配置Hibernate事務的核心: 1.配置SessionFactory 2.配置事務容器 3.配置事務規則 4.配置事務入口