Spring事務配置筆記(實現不同Service間調用事務)

          一、關鍵配置示例:
          <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;

          posted on 2008-04-29 11:58 劉錚 閱讀(837) 評論(0)  編輯  收藏 所屬分類: Spring

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          留言簿(1)

          文章分類(141)

          文章檔案(147)

          搜索

          最新評論

          主站蜘蛛池模板: 长垣县| 弥渡县| 鹿泉市| 普兰店市| 澎湖县| 阿克苏市| 徐汇区| 盐亭县| 玉林市| 安平县| 昌宁县| 左云县| 鄂温| 屏东县| 姚安县| 犍为县| 祁东县| 新余市| 罗源县| 河东区| 峨边| 五华县| 永新县| 墨江| 安陆市| 兴隆县| 邢台市| 洪江市| 乐都县| 桓台县| 巴南区| 和顺县| 浮梁县| 晋宁县| 大厂| 改则县| 富源县| 那曲县| 吐鲁番市| 邢台市| 循化|