2013-04-10 22 views
9

Mam istniejącej aplikacji, która używa Hibernate SessionFactory dla jednej bazy danych. Dodajemy kolejną bazę danych do wykonywania analiz. Transakcje nigdy nie przekroczą, więc nie potrzebuję JTA, ale chcę użyć JPA EntityManager dla nowej bazy danych.Czy istnieje sposób zdefiniowania domyślnego menedżera transakcji na wiosnę

Skonfigurowałem EntityManager i nowego menedżera transakcji, który zakwalifikowałem, ale Spring skarży się, że muszę zakwalifikować moje adnotacje @Transactional. Próbuję znaleźć sposób, aby powiedzieć Springowi, że domyślnie używa txManager. Czy jest jakiś sposób na zrobienie tego? W przeciwnym razie będę musiał dodać kwalifikator do wszystkich istniejących adnotacji @Transactional, których chciałbym uniknąć, jeśli to możliwe.

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

Błąd Dostaję

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

Dzięki

Odpowiedz

18

udało mi się rozwiązać ten problem za pomocą @Primary adnotacji

@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

Czy można to zrobić w XML, ponieważ już mamy zdefiniowany w XML XML Manager Transakcji. Dzięki. – Mustafa

+1

@Mustafa Tak, wystarczy użyć atrybutu "primary" i ustawić go na "true" na komponencie bean, który ma być podstawowym. – Josh

0

Ponieważ ten sam rodzaj ziarna jest produkowana z dwóch metod, należy zakwalifikować @Transactional adnotacji przy nazwie fasoli. W prosty sposób, aby zaspokoić swoje potrzeby, użyjesz dwóch różnych kontekstów aplikacji Spring. Jeden działa ze starym źródłem danych, a drugi działa z nowym. Każdy z tych kontekstów będzie miał tylko jedną metodę tworzenia instancji PlatformTransactionManager.

+0

Ciągnięcie nową konfigurację źródła danych do nowego pliku (oraz w osobnym słoiku) nie pomaga. Ten sam błąd. – Josh

Powiązane problemy