以注释样式使用Hibernate的多个数据库
在这个网站上有很多关于这个主题的讨论,但是我正在使用注释来创建sessionFactory以注释样式使用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
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;
}
}