2011-12-30 79 views
0

試圖在彈簧沒有sucess實施@Transactional,Hibernate項目與模式,在其上使用@Transactional AspectJ的@Transactional不工作

方法。

@Transactional 
    public void invokeService() throws Exception { 
     Certificate certificate = (Certificate) domainObjects.get(Constants.CERTIFICATE); 
     CertActObjRel accOvrRel = (CertActObjRel) domainObjects.get(Constants.CERT_ACC_OBJ_REL); 
     if (certificate != null) { 
     dao.insert(certificate); 
     if (accOvrRel != null) { 
       dao.insert(accOvrRel); 
     } 
     CertObjRel certObjRel = (CertObjRel) domainObjects.get(Constants.CERT_OBJ_REL); 
     if (certObjRel != null) { 
       List<CertObjRel> certObjRelArray = certObjRel.getCertObjRelArray(); 
      if (certObjRelArray != null && certObjRelArray.size() > 0) { 
        dao.insertList(certObjRelArray); 
        } 

       } 
     } 
      insertReqCertRelation(); 
      insertDistributions(); 
      fieldIssueUOW.fieldIssueCertificate(certificate); 
     } 

方法invokeService()是一個abtsract方法和子類實現(與事務註釋。用於abtsract超級CALSS方法invokeService否@Transactional註解()),並從口水規則引擎呼籲基礎對象refrence 。由於類bean不是spring bean,因此我們使用編譯時編織。對於事務管理

Spring配置文件中的聲明

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory"> 
      <ref bean="sessionFactory" /> 
     </property> 
    </bean> 

彈簧aspect.jar也粘貼在WEB-INF/lib文件夾。用

System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive()); 

總是返回false。如果我們試圖在這個方法中檢索當前會話,則返回null。所以它確定交易沒有運行。我們是否需要用方法invokeservice()聲明類爲@Aspect。 @ Aspect是編譯時間編織的先決條件。即使在反編譯.class文件並查看代碼@Transactional仍然存在之後?

回答

0

從Spring文檔2.5

http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html

默認模式「代理」將處理註釋的豆到使用Spring的AOP框架(以下代理語義被代理 ,如上所討論 ,施加到僅通過代理進入的方法調用)。 替代模式「aspectj」將用Spring的AspectJ事務方面​​(修改目標類 字節代碼以適用於任何類型的方法調用)編織受影響的類 。 AspectJ 編織要求類路徑上的spring-aspects.jar以及啓用加載時編織(或編譯時編織)的 。 (請參閱部分 標題爲第6.8.4.5,「Spring配置」有關如何 設置負載時編織的細節。)

你有負載時編織建立?你有編譯時織入設置嗎?你是用AspectJ事務註釋而不是Spring來裝飾類的嗎?

刪除mode =「aspectj」,看看它是否開始爲你工作。如果是,則調查您是否在運行時擁有合適的織布工。

相關問題