Несколько баз данных с использованием Hibernate в стиле аннотации

На сайте было несколько обсуждений по этой теме, но я использую аннотации для создания sessionFactory.

private SessionFactory sessionFactory;

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

Так выглядит hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">xxxxx</property>
    <property name="hibernate.connection.url">xxxxx</property>
    <property name="hibernate.connection.username">XXXX</property>
    <property name="hibernate.connection.characterEncoding">utf-8</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.use_sql_comments">true</property>
    <mapping class="XXXX" />
</session-factory>
</hibernate-configuration>

Это applicationContext.xml

<!-- add tomcat datasource instance to springs context -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/XXXXDS" />
    <property name="resourceRef" value="true" />
</bean>

Как в этом случае добиться интеграции нескольких БД. Одним из решений, с которым я столкнулся, было создание нескольких файлов hibernate.cfg.xml и создание для него еще одной фабрики сеансов.

Но у меня есть два сомнения: 1) Как мне указать в автоматическом подключении, какой sessionFactory выбрать, 2) Мне придется дублировать много информации в hibernate.xml, например beans. Есть ли более чистый подход к этой проблеме?


person Smiles in a Jar    schedule 26.03.2012    source источник
comment
Есть ли причина, по которой вы не хотите / не можете использовать bean-инъекцию для DAO? Это решит вашу проблему.   -  person bvulaj    schedule 26.03.2012
comment
Извините, но не могли бы вы быть более конкретными, дайте мне несколько примеров, ссылки для этого подхода. Я привыкаю к ​​Spring + Hibernate, поэтому для меня это уникальная ситуация.   -  person Smiles in a Jar    schedule 26.03.2012


Ответы (2)


Первый вопрос: @Autowired с @Qualifier ("name") поможет вам выбрать, какой sessionFatory.

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

Второй вопрос: вы можете установить свойства спящего режима: схему и каталог, чтобы указать базу данных при работе с несколькими базами данных. У меня есть опыт работы с MS SQL Server, поэтому в сущности я добавил аннотацию @Table («[база данных]. [Схема]. [Имя таблицы]») и ее сопоставление с конкретной таблицей в нескольких базах данных.

person mino.me    schedule 26.03.2012
comment
да этот сол работает отлично. Спасибо. Я добавил это раньше, но почему-то комментарий отсутствовал. - person Smiles in a Jar; 30.03.2012

Размещено в ссылке на комментарии.

Ваши фабрики сессий:

<bean id="mySessionFactory1" class="...">
    ...
</bean>
<bean id="mySessionFactory2" class="...">
    ...
</bean>

Ваши DAO:

<bean id="myHibernateDao1" abstract="true" p:sessionFactory-ref="mySessionFactory1" />
<bean id="myHibernateDao2" abstract="true" p:sessionFactory-ref="mySessionFactory2" />

<bean id="myObj1Dao" parent="myHibernateDao1" class="..." />
<bean id="myObj2Dao" parent="myHibernateDao1" class="..." />
<bean id="myObj3Dao" parent="myHibernateDao1" class="..." />
<bean id="myObj4Dao" parent="myHibernateDao2" class="..." />
<bean id="myObj5Dao" parent="myHibernateDao2" class="..." />
person bvulaj    schedule 26.03.2012