Несколько SessionFactories, несколько источников данных и Hibernate TransactionManager могут занимать только один Sessionfactory - PullRequest
5 голосов
/ 10 декабря 2010

У меня есть аннотация @Transactional во всех моих DAO, но я могу определить только один TransactionManager, который принимает только один SessionFactory. У меня есть один SessionFactory для каждого клиента, один источник данных для каждого клиента, и, очевидно, мне нужно изменить TransactionManager для каждого клиента. Но как получить правильный менеджер транзакций для клиента, если я могу определить только одно имя bean-компонента Spring для одного TransactionManager?

Ответы [ 3 ]

8 голосов
/ 10 декабря 2010

Spring 3 поддерживает несколько менеджеров транзакций, сохраняя при этом декларативное разделение @Transactional

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

Разве это не то, что вам нужно?

2 голосов
/ 10 декабря 2010

Это пример того, где декларативное управление транзакциями в Spring больше не удобно, и вам нужно переключиться на программное управление , чтобы получить необходимую гибкость. Это позволит вам внедрить, например, карту менеджеров транзакций в ваш уровень DAO и соответственно выбрать правильный, используя TransactionTemplate, чтобы упростить задачу.

В качестве альтернативы, если вы работаете в контейнере, поддерживающем JTA, то вы можете использовать Spring * JtaTransactionManager. Это делегирует управление транзакциями серверу приложений, сохраняя семантику Spring API. Это также означает, что произвольное число DataSources и SessionFactories может участвовать в одном диспетчере транзакций. Однако это означает, что ваши источники данных должны полностью управляться сервером приложений, который, вероятно, не будет работать для вас.

1 голос
/ 10 декабря 2010

Вы можете создать PlatformTransactionManager, который будет делегировать вызовы для конкретного менеджера транзакций для текущего клиента. Текущий пользователь может быть сохранен, например, как переменная ThreadLocal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...