2016-11-18 2 views
0

Моего основным требования иметь несколько объектов SessionFactory указать две различные схемы (это логическая группировка, каждая логическая группа имеет несколько схем в ней), так вот конфигурация: Multiple менеджера транзакций с несколькими сессионных заводами

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

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

теперь я создал класс Дао, который имеет метод сохранения

@Transactional 
public void save(Object){ 
    sessionFactory2.getCurrentSession().save(object); 
} 

этот код работает отлично, но на мой вопрос заключается в том, какие транзакции менеджер будет выбран по @Transactional апп otation?

или есть способ распечатать его в журнале?

+0

Просьба также предложить, если я могу изменить логику аннотации @transactional. –

+0

В вашем случае 'transactionManager2' ... Наличие нескольких элементов' 'не имеет смысла и довольно бесполезно. Последний из них будет эффективным. И когда вы укажете конкретный «менеджер транзакций», который будет использоваться по умолчанию, если в аннотации '@ Transactional' не указано явное. –

ответ

0

Если вы разместили (псевдо) конфигурацию, это также тот порядок, в котором вы определили его тогда всегда будет использоваться transactionManager2.

Определение нескольких элементов <tx:annotation-driven /> не имеет значения. С помощью этого элемента вы указываете, что хотите использовать транзакции, обработанные аннотациями, и что вы хотите использовать заданный transaction-manager в качестве менеджера транзакций по умолчанию.

В вашем случае вы определили 2, и последний будет тем, который является эффективным.

При использовании нескольких менеджеров транзакций вы ДОЛЖНЫ указать в аннотации @Transactional, какой менеджер транзакций использовать для этого конкретного транзакционного метода.

Таким образом, вам необходимо указать либо @Transactional("transactionManager1"), либо @Transactional("transactionManager2"), в зависимости от того, какой из них вы видите по умолчанию.

+0

Спасибо Deinum, теперь я могу представить фоновый процесс. но, пройдя свой ответ, снова возникают два вопроса: 1. У нас есть какой-либо процесс, когда я могу выбрать динамический менеджер транзакций при применении аннотации? 2. Какое использование экземпляра sessionFactory, который мы устанавливаем в диспетчер транзакций. потому что в этом случае может случиться так, что transactionManager2 применяется при сохранении объекта с sessionFactory1, где нет никакого отношения к sessionFactory1 и transactionManager2. –

0

ЮО может указать менеджер transacion к вам, передавая ее имя в аннотации Например:

@Transactional(value="transactionManager2") 
public void save(Object){ 
    sessionFactory2.getCurrentSession().save(object); 
} 

Вы можете найти более подробную информацию здесь http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html

Я надеюсь, что это полезно

Angelo

Смежные вопросы