【问题标题】:Using multiple DataSources in Spring and Hibernate在 Spring 和 Hibernate 中使用多个数据源
【发布时间】:2014-10-21 06:57:54
【问题描述】:

我有一个主数据源,我有读/写访问权限和另一个数据源,我只是从中提取数据并将其导入我的主数据源。

目前我的整个应用程序只使用读/写数据库。因此,我是这样配置的:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
                        http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <context:annotation-config />

    <context:component-scan base-package="com.limitCalculator"
        annotation-config="true" />

    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="true" />

    <bean id="mainGUI" class="com.limitCalculator.gui.scenarioSelection.MainWindow" />

    <!-- 1 Data Source -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
        <property name="url" value="jdbc:hsqldb:hsql://localhost/testDB" />
        <property name="username" value="sa" />
        <property name="password" value="" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="jpaData" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="entityManager"
        class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <!-- 2 Data Source -->
    <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
        <property name="url"
            value="jdbc:oracle:thin:@test.com.vi:1234:TEST" />
        <property name="username" value="test_db" />
        <property name="password" value="abcde" />
        <property name="maxActive" value="20" />
    </bean>
</beans>

我的 DAO 调用:

@Component
public class SettingsDaoImpl {

    @Autowired
    @PersistenceContext    
    public EntityManager em;

    public SettingsDaoImpl() {
        super();
    }

    @Transactional
    public Long save(Settings sr)
    {
        em.persist(sr);
        return sr.getId();
    }

如您所见,我在应用程序中添加了第二个数据库。但是,我不知道如何在我的 SettingsDaoImpl 中正确调用它?

关于如何在我当前的架构中实现这一点的任何建议。

【问题讨论】:

  • 这可能与以下内容重复:stackoverflow.com/questions/20541736/…
  • @JorisHilhorst 感谢您的回答!但是,我是否需要使用其他注释(例如 Qualifier 注释)更改第一个数据源?

标签: java database spring hibernate


【解决方案1】:

您需要为每个数据源创建不同的实体管理器,并在代码中定义 @PersistenceContext 的 unitName 属性以注入特定的实体管理器。

【讨论】:

  • 我很想看到一个确切的例子来说明你将如何做到这一点!
  • 您可以参考以下链接,例如:[link](blogs.isostech.com/enterprise-application-development/enterprise-application-development-using-multiple-entity-managers)
猜你喜欢
  • 2010-10-26
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多