一、關鍵配置示例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<!-- bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<!-- Hibernate Transaction Interceptor Definition -->
<bean id="hibernateTransactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
parent="transactionIntercetorTemplate">
<property name="transactionManager">
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</property>
</bean>

<!-- Transction Intercetor's Template -->
<bean id="transactionIntercetorTemplate" abstract="true">
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-BussException</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<!-- 定義自動代理生成器-->
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref bean="hibernateTransactionInterceptor" />
<idref bean="jdbcTransactionInterceptor" />
</list>
</property>
<property name="beanNames">
<value>*Service</value>
<!--list>
<idref bean="bookService" />
</list-->
<!--添加Service bean-->
</property>
</bean>
<bean id="hibernateDaoTemplate" abstract="true">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- Dao 定義 -->
<bean id="imageDao" class="com.fbyssssite.dao.ImageDao"
parent="hibernateDaoTemplate" />
<bean id="imageFolderDao" class="com.fbyssssite.dao.ImageFolderDao"
parent="hibernateDaoTemplate" />
<!-- Service 定義 -->
<bean id="imageService" class="com.fbyssssite.bo.ImageService" autowire="byName">
<property name="dao" ref="imageDao"></property>
</bean>
<bean id="imageFolderService" class="com.fbyssssite.bo.ImageFolderService" autowire="byName">
<property name="dao" ref="imageFolderDao"></property>
</bean>
二、測試代碼:

public void delete(Object entity,IBaseUser user) throws BussException ...{
super.delete(entity, user);
ImageFolder folder = (ImageFolder)entity;
String folderId = folder.getId();
IImageService imageService = ServiceFactory.getImageService();
imageService.deleteAllInFolder(folderId,user);
}

public void deleteAllInFolder(String id,IBaseUser sysUser) throws BussException ...{(來源:www.iocblog.net)
log.info("刪除圖片夾'"+id+"'中的圖片...");
throw new BussException(1,"臨時測試:測試事務是否生效的異常。測試完畢后刪除此語句。",log);

/**//*
StringBuffer sql = new StringBuffer("delete ");
sql.append("from ");
sql.append(getEntityClassName());
SqlBuilder sqlBuilder = SqlBuilder.getInstance();
sqlBuilder.appendWhereCondition(sql, "folderId='"+id+"'");
bulkUpdate(sql.toString(), sysUser);
*/
}
三、測試效果:
拋出BussException之后,imageFolder實體并沒有被刪除,而是回滾了。
四、注意事項:
1.其中的 BussException是一個CheckedException(繼承自Exception),這里不過是一個例子,如果其他方法需要同樣的方式處理事務,也要加上-BussException,否則不能回滾;如果是一個UnCheckedException,就不需要在這里配置,默認就會回滾。
2.如果采用MySQL,show table status可以查看表的ENGINE類型,MyISAM是不支持事務的,如果需要事務,應該改成InnoDB:alter table [tablename] engine = InnoDB;