一个项目中hibernate框架下配置多个数据库

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对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值