您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Hibernate使用多个数据库

Hibernate使用多个数据库

我假定你有一组应使用的DAO的dataSource1和适当的sessionFactory1,而其他人应该使用不同的dataSouce2sessionFactory2基于dataSource2。当然,你需要声明第二个dataSource和其他bean:只需复制你已有的配置并更改bean id,以免它们冲突。除<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,但是如你所见,应该仔细考虑问题。

至于自动装配-如果你按名称自动装配,请为你的字段命名与会话工厂或数据源ID相同,它应该起作用-但实际上这是你的最小问题。

我找到了另一个解决方案,并且使用了相同的方法添加一个dataSource和SessionFactory,然后在注入sessionFactory的DAO方法中,添加@Qualifier注释以及所需sessionFactory的属性,如下所示:

  @Autowired 
    public ProgramaSgteDAOHibernate(@Qualifier("sessionFactory3") SessionFactory sessionFactory) { 
     super(sessionFactory); 
    }
其他 2022/1/1 18:18:22 有377人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶