Question

Je suis toujours dans une étape d'apprentissage avec les transactions de printemps et AOP, et j'ai quelques erreurs:
1. Si je n'utilise pas d'avoir un AOP-Advice et je spécifie pour chaque service quelque chose comme:

@Transactional (rollbackfor = java.lang.exception.class, readonly = true)

Et puis je regarde Spring Log, tout semble fonctionner comme prévu. Ce que je veux dire par là, c'est qu'une transaction est créée, et en cas d'exception, j'obtiens un retour en arrière. Mais si vous utilisez quelque chose comme:

    <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>

Donc, quand je regarde le journal Spring, en utilisant ce scénario, il semble qu'il y ait 2 transactions, à l'intérieur d'un autre, car après le Rollback, j'obtiens quelque chose comme:

(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.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization@63fd1f47] for key [org.hibernate.ejb.EntityManagerImpl@4eb35bed] 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 [org.hibernate.ejb.EntityManagerImpl@b3fbd77]
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.EntityManagerHolder@45a27493] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7ed30037] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@b3fbd77] 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 [org.hibernate.ejb.EntityManagerImpl@405c9cef]
(AbstractPlatformTransactionManager.java:948) - Triggering afterCommit synchronization
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.EntityManagerHolder@1f0cf366] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@6012b597] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@405c9cef] after transaction
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager

Comme vous pouvez le voir, j'ai marqué la ligne que je ne comprends pas.

Et le deuxième problème: dans le même fichier journal, j'ai remarqué une ligne comme:

(JpaTransactionManager.java:407) - Not exposing JPA transaction [org.hibernate.ejb.EntityManagerImpl@b3fbd77] as JDBC transaction because JpaDialect [org.springframework.orm.jpa.DefaultJpaDialect@77acf1c0] does not support JDBC Connection retrieval

Et j'ai googlé un peu et après avoir ajouté ceci:

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

EntityManager Bean, il semble maintenant que JPA expose la transaction à la transaction JDBC. Le problème est que je ne sais pas quels sont les avantages / inconvénients de cette configuration.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top