2012-01-19 216 views
0

我仍然處於春季交易和aop的學習階段,我有一些誤會:
1.如果我不使用aop-advice,並且我爲每個服務指定了如下內容:
春季交易和AOP

@Transactional(的rollbackFor = java.lang.Exception.class,只讀= TRUE)

,然後我看看春天登陸一切似乎都按預期運行。我的意思是,創建一個事務,並在例外情況下得到回滾。但是,如果u使用類似:

<bean id="txManagerVA" class="org.springframework.orm.jpa.JpaTransactionManager"> 
      <property name="entityManagerFactory" ref="emfVA" />   
     </bean> 

     <tx:annotation-driven transaction-manager="txManagerVA" /> 
<aop:config> 
    <aop:pointcut id="transactionalServiceMethodsVA" expression="execution(* xxx.services.vs.*.*(..))"/> 
    <aop:advisor advice-ref="txManagerVAAdvice" pointcut-ref="transactionalServiceMethodsVA"/> 
</aop:config> 

<tx:advice id="txManagerVAAdvice" transaction-manager="txManagerVA"> 
    <tx:attributes> 
    <tx:method name="get*" rollback-for="java.lang.Exception" read-only="true"/>  
    <tx:method name="*" rollback-for="java.lang.Exception" /> 
    </tx:attributes> 
</tx:advice> 

所以,當我看到春天的日誌,使用此方案,似乎有2筆交易,裏面另一個,因爲回滾之後,我得到的東西,如:

(IntermedServiceImpl.java:45) - WE HAVE AN EXCEPTION !!!! nullCrocodilu 
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.Exception] 
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.Ex[email protected]63fd1f47] for key [[email protected]] from thread [thread-pool-1-8080(6)] 
(AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback 
//SO FAR SO GOOD 
(JpaTransactionManager.java:533) - Rolling back JPA transaction on EntityManager [[email protected]] 
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization 
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]7ed30037] from thread [thread-pool-1-8080(6)] 
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction 
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager 
--> (AbstractPlatformTransactionManager.java:1012) - Resuming suspended transaction after completion of inner transaction <-- 
(TransactionSynchronizationManager.java:272) - Initializing transaction synchronization 
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: null 
(RuleBasedTransactionAttribute.java:152) - No relevant rollback rule found: applying default rules 
(AbstractPlatformTransactionManager.java:922) - Triggering beforeCommit synchronization 
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization 
(AbstractPlatformTransactionManager.java:752) - Initiating transaction commit 
(JpaTransactionManager.java:507) - Committing JPA transaction on EntityManager [[email protected]] 
(AbstractPlatformTransactionManager.java:948) - Triggering afterCommit synchronization 
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization 
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]6012b597] from thread [thread-pool-1-8080(6)] 
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction 
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager 

正如你可以看到那裏我已經標記了我不明白的路線。

而第二個問題:在同一個日誌文件i`ve發現這樣一行:

(JpaTransactionManager.java:407) - Not exposing JPA transaction [[email protected]] as JDBC transaction because JpaDialect [[email protected]] does not support JDBC Connection retrieval 

和我GOOGLE了一點點,之後添加此:

<property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     </bean> 
    </property> 

entitymanager bean,現在看來jpa將事務暴露給jdbc事務。 問題是我不知道這個配置有什麼優點/缺點。

回答

0

似乎問題在於我使用xml事務配置(aop部分)和註釋事務配置(@Transactional(rollbackFor = java.lang.Exception.class,readOnly = true))部分。如果我刪除註釋一切正常。