以注释样式使用Hibernate的多个数据库

以注释样式使用Hibernate的多个数据库,hibernate,hibernate-mapping,multiple-databases,Hibernate,Hibernate Mapping,Multiple Databases,在这个网站上有很多关于这个主题的讨论,但是我正在使用注释来创建sessionFactory private SessionFactory sessionFactory; @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; 这就是hibernate.cfg.xml的样子 <hibernate-configura

在这个网站上有很多关于这个主题的讨论,但是我正在使用注释来创建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>

假的
org.hibernate.cache.HashtableCacheProvider
com.mysql.jdbc.Driver
xxxxx
xxxxx
XXXX
utf-8
org.hibernate.dialogue.mysqlinnodbdialogue
真的
真的
真的
这是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。对于这个问题有没有更干净的方法?

参考评论发布

您的会话工厂:

<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="..." />

参考评论发布

您的会话工厂:

<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="..." />

第一个问题:@Autowired with@Qualifier(“name”)将帮助您选择哪个sessionFatory

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

第二个问题:在处理多个数据库时,可以设置hibernate属性:schema和catalog以指定数据库。我有使用MS SQL Server的经验,因此在实体中我添加了注释@Table(“[database].[schema].[tablename]”),并将其映射到多个数据库中的特定表

第一个问题:@Autowired with@Qualifier(“name”)将帮助您选择哪个sessionFatory

@Autowired
@Qualifier("sessionFactoryName")
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
...
}
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;
    }


}

第二个问题:在处理多个数据库时,可以设置hibernate属性:schema和catalog以指定数据库。我有使用MS SQL Server的经验,因此在实体中我添加了注释@Table(“[database].[schema].[tablename]”),并将其映射到多个数据库中的特定表

你有没有理由不想/不能在DAO中使用bean注入?这将解决您的问题。对不起,但请您更具体地说,为我提供一些例子,这种方法的链接。我已经习惯了Spring+Hibernate,所以这对我来说是一个独特的情况。你有没有理由不想/不能在DAO中使用bean注入?这将解决您的问题。对不起,但请您更具体地说,为我提供一些例子,这种方法的链接。我已经习惯了Spring+Hibernate,所以这对我来说是一个独特的情况。是的,这个解决方案非常有效。谢谢我在前面添加了这个,但是不知怎么的,这个注释不见了。是的,这个soln非常好用。谢谢我早些时候添加了这一点,但不知怎么的,这条评论不见了。
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;
    }


}