Несколько баз данных, использующих Hibernate в стиле аннотации - PullRequest
0 голосов
/ 26 марта 2012

Было несколько обсуждений этой темы на сайте, но я использую аннотации по всему для создания 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) Как указать в autowiring, какой sessionFactory выбрать, 2) Мне придется дублировать большую часть информации через hibernate.xml, например, bean-компоненты.Есть ли более чистый подход к этому вопросу?

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

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

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

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

1 голос
/ 26 марта 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="..." />
0 голосов
/ 21 февраля 2018
import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

@Configuration
@ComponentScan({ "component.name" })
@PropertySources(@PropertySource(value = {"file:/file1.properties", "classpath:file2.properties"}))
public class HibernateConfiguration {

    @Bean
    public LocalSessionFactoryBean firstSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(firstDataSource());
        sessionFactory.setPackagesToScan(new String[] { "com.test" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
     }

    @Bean
    public DataSource firstDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("DRIVER_NAME");
        dataSource.setUrl("DATABASE_URL");
        dataSource.setUsername("DATABASE_USER");
        dataSource.setPassword("DATABASE_PASS");
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean secondSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(secondDataSource());
        sessionFactory.setPackagesToScan(new String[] { "com.test" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
     }

    @Bean
    public DataSource secondDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("DRIVER_NAME");
        dataSource.setUrl("DATABASE_URL");
        dataSource.setUsername("DATABASE_USER");
        dataSource.setPassword("DATABASE_PASS");
        return dataSource;
    }


    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", org.hibernate.dialect.DB2Dialect);
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.format_sql", true);
        properties.put("hibernate.default_schema", SCHEMA_NAME);
        return properties;        
    }

    @Bean
    public HibernateTransactionManager firstTransactionManager() {
       HibernateTransactionManager txManager = new HibernateTransactionManager();
       txManager.setSessionFactory(firstSessionFactory().getObject());
       return txManager;
    }

    @Bean
    public HibernateTransactionManager rdsaTransactionManager() {
       HibernateTransactionManager txManager = new HibernateTransactionManager();
       txManager.setSessionFactory(rdsaSessionFactory().getObject());
       return txManager;
    }


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