Как обрабатывать несколько соединений с базами данных с использованием фабрик сессий в Spring и Hibernate - PullRequest
1 голос
/ 08 июля 2011

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

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="hibernateProperties">
  <props>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.connection.pool_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.transaction.auto_close_session">true</prop>
    <prop key="hibernate.transaction.flush_before_completion">true</prop>
    <prop key="current_session_context_class">true</prop>

    <!--HSQL-->
    <prop key="hibernate.connection.datasource">java:comp/env/jdbc/xxx</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

  </props>
</property>
<property name="annotatedClasses">
  <list>
    <value>com.mytest.examples.Person</value>
    <value>com.mytest.examples.Customer</value>
    <value>com.mytest.examples.Employee</value>
  </list>
</property>

Второй сеансFactory указывает на вторую базу данных следующим образом

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="hibernateProperties">
  <props>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.connection.pool_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.transaction.auto_close_session">true</prop>
    <prop key="hibernate.transaction.flush_before_completion">true</prop>
    <prop key="current_session_context_class">true</prop>

    <!--HSQL-->
    <prop key="hibernate.connection.datasource">java:comp/env/jdbc/yzz</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

  </props>
</property>
<property name="annotatedClasses">
  <list>
    <value>com.mytest.examples.Container</value>
    <value>com.mytest.examples.Credentials</value>
  </list>
</property>

Теперь, когда я попытаюсь использовать эти фабрики, используя следующее

Session session = getHibernateTemplate().getSessionFactory().openSession();

Я всегда получаю первую фабрику по умолчанию и могу получить доступ ко всем таблицам в ее схеме, но не ко второй. Как мне указать, какую фабрику я хочу использовать?

1 Ответ

1 голос
/ 08 июля 2011

Конструктор HibernateTemplate принимает SessionFactory в качестве аргумента.Я не знаю, что getHibernateTemplate() делает в вашем коде, но он должен возвращать HibernateTemplate, созданный с одним из определенных вами компонентов SessionFactory (либо объявив их в XML-файле контекста весны, либо создав их в Java изодин из внедренных сеансовых фабрик).

Обратите внимание, что, как сказано в документации HibernateTemplate (жирным шрифтом):

Начиная с Hibernate 3.0.1, транзакционный код доступа Hibernate также можетбыть закодирован в простом спящем стиле.Следовательно, для вновь начатых проектов рассмотрите возможность принятия вместо этого стандартного стиля Hibernate3 для кодирования объектов доступа к данным на основе SessionFactory.getCurrentSession ().

Я бы внедрил фабрику сеансов напрямую и использовал бы Hibernate APIнепосредственно.HibernateTemplate мало что дает по сравнению с Hibernate API и часто мешает, IMHO.(Например, не предоставляя эквивалент Query.uniqueResult()).

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