hibernate框架下配置多个数据库
当我们在同一个项目中需要同时连接多个数据库时,在hibernate框架下的我们可以通过配置多个sessionFactory与多个连接池配置实现获取不同数据库的连接session对象。
初始化hibernate的sessionFactory
通过spring全注解方式初始化hibernate
配置如下:
@Bean
public DataSource druidDataSourceForMySQL() {
DruidDataSource database = new DruidDataSource();
database.setDriverClassName(environment.getProperty("jdbc.mysql.driverClassName"));
database.setUrl(environment.getProperty("jdbc.mysql.url"));
database.setUsername(environment.getProperty("jdbc.mysql.username"));
database.setPassword(environment.getProperty("jdbc.mysql.password"));
database.setDefaultAutoCommit(false);
database.setTimeBetweenEvictionRunsMillis(3600000);
database.setMinEvictableIdleTimeMillis(3600000);
database.setInitialSize(1);
return database;
}
@Bean(name = "sessionFactory")
@Profile("mysql_develop")
public LocalSessionFactoryBean sessionFactoryForMySQL() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
// 设置数据源
sessionFactory.setDataSource(druidDataSourceForMySQL());
// 设置entity所在包,用于自动扫描
sessionFactory.setPackagesToScan(new String[]{"com.hcicloud.sap.model"});
// 设置Hibernate的配置属性
Properties props = new Properties();
props.setProperty("hibernate.dialect", environment.getProperty("hibernate.mysql.dialect"));
props.setProperty("hibernate.default_schema", environment.getProperty("hibernate.mysql.default_schema"));
props.setProperty("hibernate.show_sql", environment.getProperty("hibernate.show_sql"));
props.setProperty("hibernate.format_sql", environment.getProperty("hibernate.format_sql"));
props.setProperty("hibernate.hbm2ddl.auto", environment.getProperty("hibernate.hbm2ddl.auto"));
props.setProperty("hibernate.use_sql_comments", environment.getProperty("hibernate.use_sql_comments"));
props.setProperty("hibernate.connection.deferPrepares", "false");
props.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
props.setProperty("hibernate.jdbc.batch_size", environment.getProperty("hibernate.jdbc.batch_size"));
props.setProperty("hibernate.jdbc.fetch_size", environment.getProperty("hibernate.jdbc.fetch_size"));
// 强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。
props.setProperty("hibernate.order_updates", "true");
// session在事务完成后将被自动清洗(flush)
props.setProperty("hibernate.transaction.flush_before_completion", "true");
props.setProperty("hibernate.query.substitutions", environment.getProperty("hibernate.query.substitutions"));
props.setProperty("hibernate.default_batch_fetch_size", environment.getProperty("hibernate.default_batch_fetch_size"));
// 为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取
props.setProperty("hibernate.max_fetch_depth", environment.getProperty("hibernate.max_fetch_depth"));
props.setProperty("hibernate.generate_statistics", environment.getProperty("hibernate.generate_statistics"));
props.setProperty("hibernate.bytecode.use_reflection_optimizer", environment.getProperty("hibernate.bytecode.use_reflection_optimizer"));
props.setProperty("hibernate.cache.use_second_level_cache", "true");
props.setProperty("hibernate.cache.use_query_cache", "true");
props.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.EhCacheRegionFactory");
props.setProperty("net.sf.ehcache.configurationResourceName", environment.getProperty("hibernate.net.sf.ehcache.configurationResourceName"));
props.setProperty("hibernate.cache.use_structured_entries", environment.getProperty("hibernate.cache.use_structured_entries"));
sessionFactory.setHibernateProperties(props);
return sessionFactory;
}
注入sessionFactory
通过如让的配置我们获取了指定连接池的sessionFactory
在我们编写的hibernateDao中通过@Autowired与@Qualifier(byName)将sessionFactory进行加载获取session对象
代码如下:
@Autowired
@Qualifier("sessionFactory")
public void setSessionFactory(final SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
获取session对象
不同的数据库配置不同的hibernateDao类,在操作不同的数据库时,直接继承指定的hibernateDao即可。
通过getSession方法获取session对象进行查询:
public Session getSession() {
return sessionFactory.getCurrentSession();
}
getSession().create... 获取criteria 获取HQL查询对象 获取sqlQuery对象