Я предполагаю, что у вас есть набор DAO, которые должны использовать dataSource1
и соответствующий sessionFactory1
, в то время как другие должны использовать другие dataSouce2
и sessionFactory2
на основе dataSource2
.Конечно, вам нужно объявить свой второй dataSource
и другие bean-компоненты: просто скопируйте уже имеющуюся конфигурацию и измените идентификаторы bean-идентификаторов, чтобы они не конфликтовали.Все должно быть зеркально отражено, кроме <tx:annotation-driven/>
:
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- ... -->
</bean>
<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource1"/>
<!-- ... -->
</bean>
<bean id="transactionManager1" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory1"/>
<!-- ... -->
</bean>
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- ... -->
</bean>
<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource2"/>
<!-- ... -->
</bean>
<bean id="transactionManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory2"/>
<!-- ... -->
</bean>
<tx:annotation-driven transaction-manager="transactionManager1"/>
И здесь возникает реальная проблема: теперь у вас есть два менеджера транзакций, связанных с разными фабриками сеансов, которые, в свою очередь, маршрутизируются в разные источники данных.Но в аннотациях @Transactional
всегда будет использоваться только один диспетчер транзакций - тот, который по умолчанию называется transactionManager
(обратите внимание, я явно указал transactionManager1
. Это означает, что DAO, использующие второй источник данных, будут участвовать в транзакциях, запущенных в первом источнике данных - этоочевидно, не то, что предполагалось.
Для этого есть обходной путь, например, явное определение имени менеджера транзакций в аннотации @Transactional
(никогда не пробовал) или использование TransactionTemplate
, но, как вы можете видеть, проблема должна быть хорошо продумана..
Что касается автопроводки - если вы автоподключаете по имени, назовите свои поля так же, как фабрики сеансов или идентификаторы источников данных, и это должно работать - но на самом деле это ваша самая маленькая проблема.