javascript
Spring中配置Hibernate事务的四种方式
2019獨角獸企業重金招聘Python工程師標準>>>
為了保證數據的一致性,在編程的時候往往需要引入事務這個概念。事務有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.配置事務入口
轉載于:https://my.oschina.net/dreamerliujack/blog/847737
總結
以上是生活随笔為你收集整理的Spring中配置Hibernate事务的四种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记《javascript高级程序设计》
- 下一篇: UEditor工具栏上自定义按钮、图标、