当我们整合spring与hibernate时,需要处理事务的限制。如果不处理,它会使用read-only来标识每一个操作,会让数据库只有只读属性。不能对其进行更改。因此我们要对事务进行一个显示的声明:
声明的方式有两种:一种是使用AOP切面对操作的接口进行事务的限制设置。一种是使用IOC注入的方式对事务进行限制处理。两种方式都是处理applicationContext.xml文件。
先说明第一种方式:
对applicationContext.xml文件中添加:
1、添加事务处理的bean
//
实施事务管理的
bean<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
<bean id=”transactionManager”
class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>
<property name=”sessionFactory”>
<ref bean=”sessionFactory” />
</property>
</bean> |
2、添加事务限制处理
//
给事务添加的属性
<tx:advice id=”txAdvice” transaction-manager=”transactionManager”>
<tx:attributes >
//propagation
表示的是事务的传播特性,使用
required
时,是当检测到
add
开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。
<tx:method name=”add*” propagation=”REQUIRED”>
<tx:method name=”delete*” propagation=”REQUIRED”>
<tx:method name=”update*” propagation=”REQUIRED”>
//
如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。
<tx:method name=”*” read-only=”true”>
</tx:attributes>
</tx:advice> |
3、添加AOP切面,对指定的接口操作或者对指定的包、子包、类进行指定
<aop:config>
<aop:pointcut id=”allManagerMethod”
expression=”execution(* com.hejianjiao.hibernate.HibernateDAO.*(..))”/>
//
调用上面配置的事务属性,可以将它给本
aop pointcut
。
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>
</aop:config> |
//expression中的内容是要执行本切面的一个接口,中的所有方法:如:一个接口中定义了操作数据的方法:com.hejianjiao.hibernate.HibernateDAO,则下面execution括号中的内容就为:* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate包中还有其它的类也有操作方法,我们要一起定义的话,就可以写为:* com.hejianjiao.*.*(..),其中(..)表示的是方法。
上面的配置将为由
'HibernateDAO'
定义的bean创建一个代理对象,这个代理对象被装配了事务通知,所以当它的相应方法被调用时,一个事务将被启动、挂起、被标记为只读,或者其它(根据该方法所配置的事务语义)。
转载于:https://blog.51cto.com/anysky130/94384