2013-04-10 11 views
9

zu definieren Ich habe eine vorhandene Anwendung, die Hibernate SessionFactory für eine Datenbank verwendet. Wir fügen eine weitere Datenbank für Analytics hinzu. Die Transaktionen werden sich niemals kreuzen, also brauche ich kein JTA, aber ich möchte JPA EntityManager für die neue Datenbank verwenden.Gibt es eine Möglichkeit, einen Standard-Transaktionsmanager in Spring

Ich habe den EntityManager und den neuen Transaktionsmanager eingerichtet, den ich qualifiziert habe, aber Spring beschwert sich darüber, dass ich meine vorhandenen @Transactional-Annotationen qualifizieren muss. Ich versuche einen Weg zu finden, Spring mitzuteilen, dass er den txManager als Standard verwenden soll. Gibt es eine Möglichkeit, dies zu tun? Ansonsten muss ich das Qualifikationsmerkmal zu allen vorhandenen @Transactional Annotations hinzufügen, die ich möglichst vermeiden möchte.

@Bean(name = "jpaTx") 
    public PlatformTransactionManager transactionManagerJPA() throws NamingException { 
    JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory()); 

    return txManager; 
    } 

    @Bean 
    public PlatformTransactionManager txManager() throws Exception { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(sessionFactory()); 
    txManager.setNestedTransactionAllowed(true); 

    return txManager; 
    } 

Fehler Ich erhalte

No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: 

Dank

Antwort

18

Ich konnte dies die @Primary Anmerkung mit lösen

@Bean(name = "jpaTx") 
    public PlatformTransactionManager transactionManagerJPA() throws NamingException { 
    JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory()); 

    return txManager; 
    } 

    @Bean 
    @Primary 
    public PlatformTransactionManager txManager() throws Exception { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(sessionFactory()); 
    txManager.setNestedTransactionAllowed(true); 

    return txManager; 
    } 
+0

Kann dies im XML erfolgen, da wir bereits den Transaction Manager in XML definiert haben. Vielen Dank. – Mustafa

+1

@Mustafa Ja, Sie verwenden nur das Attribut 'primary' und setzen es auf 'true' für die Bean, die Sie als primäres verwenden möchten. – Josh

0

Da die gleiche Art von Bohne von zwei Verfahren hergestellt wird, müssen Sie die @Transactional Anmerkung mit dem Namen Bohne qualifizieren. Ein einfacher Weg, um Ihrem Bedarf zu entsprechen, besteht darin, zwei verschiedene Spring-Anwendungskontexte zu verwenden. Einer arbeitet mit der alten Datenquelle und einer arbeitet mit neuen Datenquellen. Für jeden dieser Kontexte wird nur eine Methode zum Erstellen der PlatformTransactionManager-Instanz verwendet.

+0

Ziehen Sie die neue Datenquelle Konfiguration in eine neue Datei (und in einem separaten Gefäß) hilft nicht. Derselbe Fehler. – Josh