Всегда выбирайте первый источник данных, когда существует 2 источника данных - PullRequest
0 голосов
/ 06 апреля 2019

Я использую Spring и Hibernate на веб-сфере и пытаюсь выполнить запрос к базе данных.У меня есть 2 источника данных в 2 разных проектах, которые я импортирую, и моя проблема в том, что я выбрал только один источник данных.Вот спящий XML для каждого проекта:

проект 1:

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

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="DbSource1" />
        <property name="mappingResources">

проект 2:

<bean id="SessionFactory2" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="DbSource2" />
    <property name="mappingResources">

- Также есть шаблон JDBC для хранимой процедуры

  <bean id="retrievalService" class="xx.xx.xx.JDBCRetrievalService">
    <property name="jdbcTemplate" ref="jdbcTemplate" />   </bean>

  <bean id="transactionalService" class="xx.xx.xx.JDBCTransactionalService">
    <property name="jdbcTemplate" ref="jdbcTemplate" />   </bean>


In my project application context, I simply import the 2 xmls above 
<import resource="classpath:DBsource-hibernate1.xml" />
  <import resource="classpath:DBSource-hibernate2.xml" />

Теперь в моем коде у меня есть следующее:

public abstract class HibernateBaseDao implements Serializable {

    private static final long serialVersionUID = -8688473006487128511L;



    /** Hibernate Session factory. */
    @Qualifier("SessionFactory2")
    private SessionFactory sessionFactory;


    protected HibernateBaseDao() {
        this.sessionFactory = null;
    }


    protected SessionFactory getSessionFactory() {
        return sessionFactory;
    }


    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }


    protected Session getSession() {
        return sessionFactory != null ? sessionFactory.getCurrentSession() : null;
    }

}

@Component("MyDao")
public class MyDaoImpl
    extends HibernateBaseDao
    implements MyDaoI{

@Override
public int getValueFromDatabase(){
   SQLQuery sqlQuery =  (SQLQuery) createSQLQuery("select uservalue from MyTable");
   List<Integer> values= sqlQuery.list();
   values.get(0);
}

}

И, наконец, вот мой код, который вызывает его:

@ AutoDired MyDao myDao;

    @Override
@Transactional()
public void runQuery() throws Exception
{
      myDao.getValueFromDatabase

    }

Проблема, которую он возвращает, говоря, что таблицы не существует.После расследования я обнаружил, что это первый источник данных.Из-за этого я уже два дня тяну за волосы.Какие-либо предложения???У меня уже есть квалификатор для SessionFactory2 в базовом классе, который я расширяю

Большое вам спасибо

1 Ответ

0 голосов
/ 06 апреля 2019

Ваша проблема в том, что вы не вводите SessionFactory2 в атрибут.@Qualifier ничего не делает сам по себе, вам нужно добавить @ Autowire

Решение:

/** Hibernate Session factory. */
    @Autowire
    @Qualifier("SessionFactory2")
    private SessionFactory sessionFactory;

Кроме того, вам не нужен getter / setter для использования @Autowired назакрытый атрибут;)

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