Проблема с несколькими источниками данных - PullRequest
0 голосов
/ 25 апреля 2018

В моем проекте я использую два источника данных оракула для одного из источника данных, который я использую LocalSessionFactoryBean, а для другого LocalContainerEntityManagerFactoryBean Я отображаю источники данных соответственно, но когда я пытаюсь получить sessionFactory для LocalSessionFactoryBean, детали источника данных таковыдругого.Дону, что я делаю неправильно.

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

    <bean id="xxxEntityManagerFactoryBean"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />     
        <property name="persistenceXmlLocation" value="classpath:persistence.xml" />

        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>

            </props>
        </property>
    </bean>
    <bean class="org.modelmapper.ModelMapper" id="modelMapper"/>
    <bean id="xxxEntityManager"
        class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="xxxEntityManagerFactoryBean" />
    </bean>

    <bean id="xxxTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="xxxEntityManagerFactoryBean" />
        <property name="nestedTransactionAllowed" value="true" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaDialect" ref="jpaDialect" />
    </bean>
    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />

в другом импортированном XML-файле. У меня есть

<bean id="sessionFactoryNew"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource1" />
      <property name="packagesToScan" value="com.citi.aml.npa.domain.api" />
      <property name="hibernateProperties">
         <props>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
         </props>
      </property>
   </bean>
   <bean id="xxxTransactionManagerNew"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactoryNew" />
      <qualifier value="xxxtransaction"/>
   </bean>

в приложении context.xml. У меня есть источники данных, такие как

<beans profile="local">
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${db.oracle.driverClassName}" />
            <property name="username" value="${db.oracle.username}" />
            <property name="password" value="${db.oracle.password}" />
            <property name="url" value="${db.oracle.url}" />

        </bean>
        <context:property-placeholder location="classpath*:/config/local/yyy.properties" ignore-unresolvable="true"/>
    </beans>
<beans profile="local">
        <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${db.oracle.driverClassName}" />
            <property name="username" value="${db.oracle.username}" />
            <property name="password" value="${db.oracle.password}" />
            <property name="url" value="${db.oracle.url}" />

        </bean>
        <context:property-placeholder location="classpath*:/config/local/xxx_db.properties" ignore-unresolvable="true"/>
    </beans>

в Dao Impl Calss у меня есть

@Repository
public class OracledbTestRepository implements TestRepository {
    @Autowired
    @Qualifier(value = "sessionFactoryNew")
    SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    @Override
    public List<xxx> getTestData() {
        Session session = sessionFactory.getCurrentSession();
        System.out.println(sessionFactory);
        List<xxx> xxxTestDatas = session.createCriteria(xxx.class).list();
        return xxxTestDatas;
    }
}

любая помощь будет оценена.

1 Ответ

0 голосов
/ 25 апреля 2018

Ваша конфигурация bean-компонентов выглядит немного странно для меня. У вас есть два разных профиля с одинаковым именем. Если эти два источника данных нужно запускать одновременно, было бы проще объединить свойства базы данных в один файл и поместить обе конфигурации источника данных в один и тот же элемент профиля.

Итак, для консолидированных свойств database.properties сделайте что-то вроде:

db1.oracle.url=jdbc:oracle:thin:@server1...
db1.oracle.username=foo
...
db2.oracle.url=jdbc:oracle:thin:@server2...
db2.oracle.username=bar 

А для конфигурации бина используйте что-то вроде:

<beans profile="local">
        <context:property-placeholder location="classpath*:/config/local/database.properties" ignore-unresolvable="true"/>
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${db1.oracle.driverClassName}" />
            <property name="username" value="${db1.oracle.username}" />
            <property name="password" value="${db1.oracle.password}" />
            <property name="url" value="${db1.oracle.url}" />

        </bean>
        <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${db2.oracle.driverClassName}" />
            <property name="username" value="${db2.oracle.username}" />
            <property name="password" value="${db2.oracle.password}" />
            <property name="url" value="${db2.oracle.url}" />
        </bean>
    </beans>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...