Question

Je suis confronté à un problème, je ne sais vraiment pas comment attraper la queue de chat (si vous m'avez creusé la blague: o))

J'ai un webapp en guerre, déployé à Tomcat. La guerre contient 4 pots. 4 pots ont 4 applicationContext, avec 4 entityManager et 4 TransactionManager.

déclarer comme celui-ci (modifiez le numéro 1 ..):

      <bean id="entityManagerFactory1" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource1"
    p:persistence-unit-name="com.xxxxxx.domain"     >

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
        p:databasePlatform="${ds1.dbdialect}" p:generate-ddl="false"
            p:showSql="${ds1.showsql}"  />
    </property>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

  <bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory1">
    depends-on="entityManagerFactory1" name="transactionManager1"/>


   <tx:annotation-driven  transaction-manager="transactionManager1" />

Le contexte est un chargement comme ceci:

Mon problème, je découvre que lorsque j'utilise un BO OF 3, la transaction est ouverte avec la source de données de 2.

De plus, si je fais une persiste, j'ai le message:

AbstractsaveEventListener - retardant l'identité-insert en raison de aucune transaction en cours

Mais si je lance le Jar 1 seul (par exemple), tout fonctionne parfaitement.

Merci beaucoup pour votre illumination.

Était-ce utile?

La solution

Laisse-moi deviner:

Dans votre servlet-Context.xml, importez-vous les contextes? par exemple:

<import location="classpath:context1.xml" />
<import location="classpath:context2.xml" />

etc.

Si vous le faites, toutes les définitions de bean sont copiées à partir du contexte importé dans le contexte racine, ce qui signifie que vous avez quatre <tx:annotation-driven /> déclarations, avec différents gestionnaires de transactions. Probablement le dernier gagne.

Solutions possibles: soit Utiliser les qualifications ou Utilisez le style de la Déclaration de transaction du style XML.

Ce que je ferais, c'est probablement introduire une coutume @Transactional Annotation par contexte:

@Transactional("tx1")
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Transactional1 {}

Annotez maintenant toutes les méthodes du pot 1 avec @Transactional1, dans Jar 2 avec @Transactional2 etc. Ce mécanisme est documenté dans la section 10.5.6.3 Annotations de raccourci personnalisées

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