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

来源:互联网 发布:淘宝差评拦截在哪设置 编辑:程序博客网 时间:2024/05/21 14:04

hibernate框架下配置多个数据库

当我们在同一个项目中需要同时连接多个数据库时,在hibernate框架下的我们可以通过配置多个sessionFactory与多个连接池配置实现获取不同数据库的连接session对象。

初始化hibernate的sessionFactory

通过spring全注解方式初始化hibernate
配置如下:

@Beanpublic 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
原创粉丝点击