2013-04-10 104 views
9

我有一個現有的應用程序爲一個數據庫使用Hibernate SessionFactory。我們正在添加另一個用於分析的數據庫。事務將永遠不會交叉,所以我不需要JTA,但我確實想爲新數據庫使用JPA EntityManager。有沒有辦法在Spring中定義一個默認的事務管理器

我已經建立了EntityManager和新的事務管理器,我已經認證了,但是Spring抱怨我需要限定現有的@Transactional註釋。我試圖找到一種方法告訴Spring使用txManager之一作爲默認值。有沒有辦法做到這一點?否則,我必須將限定符添加到所有現有的@Transactional註釋中,如果可能,我會盡量避免這些註釋。

@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; 
    } 

錯誤我得到

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

感謝

回答

18

我能解決這個使用@Primary註釋

@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

這可以在XML中完成,因爲我們已經有了在XML中定義的事務管理器。謝謝。 – Mustafa 2014-07-24 23:36:17

+1

@Mustafa是的,你只需要使用屬性'primary'並將它設置爲'true'就可以成爲你想成爲主要的bean。 – Josh 2014-07-26 00:28:48

0

由於同一類型的bean是從兩種方法生產的,則必須與指定豆資格@Transactional註釋。一個簡單的方法來滿足你的需求將是使用兩個不同的Spring應用程序上下文。一個使用舊的數據源,一個使用新的數據源。這些上下文中的每一個都將只有一個生成PlatformTransactionManager實例的方法。

+0

拉動新的數據源配置到一個新文件(在一個單獨的jar)沒有幫助。同樣的錯誤。 – Josh 2013-04-11 12:34:58

相關問題