Как я могу определить несколько сессионных заводских экземпляров в Spring? - PullRequest
3 голосов
/ 27 апреля 2009

Я хотел бы иметь несколько Hibernate SessionFactories в весеннем приложении, все они с идентичными конфигурациями, за исключением DataSource. В идеале я бы приобрел конкретную SessionFactory по имени. Я должен быть в состоянии сделать это на основе состояния времени выполнения, и невозможно определить, какие фабрики сеансов мне понадобятся во время запуска приложения. По сути, мне нужен SessionFactoryTemplate или что-то вроде этого.

Возможно ли это? Как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 01 мая 2009

Вы можете определить абстрактный компонент и использовать наследование компонента. Это означает, что у вас будет определение компонента, которое работает как шаблон, и вы можете иметь несколько компонентов, просто копирующих атрибуты, установленные родительским компонентом.

Вот пример:

<bean id="abstractSessionFactory" abstract="true"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
</bean>

<bean id="mySessionFactory" parent="abstractSessionFactory">
    <property name="dataSource" ref="myDataSource"/>
    ...
</bean>

<bean id="mySessionFactory2" parent="abstractSessionFactory">
    <property name="dataSource" ref="myDataSource2"/>
    ...
</bean>

Используя атрибут abstract, вы гарантируете, что bean-компонент не будет создан и будет использоваться как шаблон.

Подробнее здесь: текст ссылки

1 голос
/ 04 мая 2009

Вы уверены, что вам нужно несколько SessionFactories? Если все сопоставления / конфигурации одинаковы и у вас просто есть несколько идентичных баз данных (например, в мультитенантном приложении?), То как насчет того, чтобы иметь один SessionFactory, который подключается к источнику данных, который динамически обеспечивает соответствующее подключение к базе данных?

См. этот вопрос для более подробной информации:

И это сообщение в блоге о динамической маршрутизации источника данных весной.

0 голосов
/ 28 апреля 2009

Я не знаю простого решения вашей проблемы с помощью Spring.

Однако вы можете использовать перехватчики Hibernate при условии, что ваши конкретные базы данных / источники данных могут быть доступны через одно соединение с базой данных master / admin. Этот пост в блоге подробно объясняет, как это делается, но суть в том, чтобы динамически заменять имена таблиц в операторах SQL, генерируемых Hibernate, квалифицированными именами, идентифицирующими разные базы данных. Это относительно легко понять и поддерживать, и хорошо работает в мультитенантной настройке моей компании.

Кроме того, вы можете попробовать написать свой собственный TransactionManager, используя HibernateTransactionManager в качестве отправной точки, добавив поддержку работы с несколькими фабриками сессий. Однако это будет означать, что вам придется по-настоящему погрузиться во внутреннюю среду поддержки Spring ORM, и это то, что я попробовал, но затем отказался от первого подхода. Я уверен, что это можно сделать с умеренными усилиями, но предыдущее решение уже делало эту работу за нас.

0 голосов
/ 27 апреля 2009

Я понятия не имею, как сейчас выглядит ваше текущее определение компонента, но не могли бы вы просто ... определить вторую SessionFactory?

<bean id="mySessionFactory1" 
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource1"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
</bean>

<bean id="mySessionFactory2"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource2"/>
    ...
</bean>

Затем вы могли бы просто соединить ваши DAO с одним sessionFactory против другого:

<bean id="myProductDao" class="product.ProductDaoImpl">
  <property name="sessionFactory" ref="mySessionFactory1"/>
</bean>

<bean id="myCompanyDao" class="product.ProductDaoImpl">
  <property name="sessionFactory" ref="mySessionFactory2"/>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...