Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring boot中动态设置hibernate.dial属性_Java_Spring_Hibernate_Spring Boot - Fatal编程技术网

Java 在spring boot中动态设置hibernate.dial属性

Java 在spring boot中动态设置hibernate.dial属性,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,我已经阅读了有关如何正确设置hibernate.dial属性的可用示例和教程,但没有找到适合我的情况的方法 本教程最适合我,但它缺乏动态设置hibernate.dial属性的能力,因为我要连接到不同类型的数据库: MS SQL 神谕 氢 MySQL 如果方言不正确,我的JPA(删除/更新)查询将失败 通过下面的@配置实现,我可以如何在运行时为每个数据源动态设置hibernate.dial 先谢谢你 @Configuration @EnableTransactionManagement @En

我已经阅读了有关如何正确设置
hibernate.dial
属性的可用示例和教程,但没有找到适合我的情况的方法

本教程最适合我,但它缺乏动态设置
hibernate.dial
属性的能力,因为我要连接到不同类型的数据库:

  • MS SQL
  • 神谕
  • MySQL
如果方言不正确,我的JPA(删除/更新)查询将失败

通过下面的
@配置实现
,我可以如何在运行时为每个数据源动态设置
hibernate.dial

先谢谢你

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.multidb",
        entityManagerFactoryRef = "multiEntityManager",
        transactionManagerRef = "multiTransactionManager"
)
public class PersistenceConfiguration {

    private final String PACKAGE_SCAN = "com.example.multidb";    

    @Primary
    @Bean(name = "mainDataSource")
    @ConfigurationProperties("app.datasource.main")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }    

    @Bean(name = "clientADataSource")
    @ConfigurationProperties("app.datasource.clienta")
    public DataSource clientADataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "clientBDataSource")
    @ConfigurationProperties("app.datasource.clientb")
    public DataSource clientBDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "multiRoutingDataSource")
    public DataSource multiRoutingDataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();

        targetDataSources.put(DBTypeEnum.MAIN, mainDataSource());
        targetDataSources.put(DBTypeEnum.CLIENT_A, clientADataSource());
        targetDataSources.put(DBTypeEnum.CLIENT_B, clientBDataSource());

        MultiRoutingDataSource multiRoutingDataSource = new MultiRoutingDataSource();

        multiRoutingDataSource.setDefaultTargetDataSource(mainDataSource());
        multiRoutingDataSource.setTargetDataSources(targetDataSources);        

        return multiRoutingDataSource;
    }   

    @Bean(name = "multiEntityManager")
    public LocalContainerEntityManagerFactoryBean multiEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        em.setDataSource(multiRoutingDataSource());
        em.setPackagesToScan(PACKAGE_SCAN);

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(hibernateProperties());        

        return em;
    }

    @Bean(name = "multiTransactionManager")
    public PlatformTransactionManager multiTransactionManager() {
        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                multiEntityManager().getObject());        

        return transactionManager;
    }

    @Primary
    @Bean(name = "dbSessionFactory")
    public LocalSessionFactoryBean dbSessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();

        sessionFactoryBean.setDataSource(multiRoutingDataSource());
        sessionFactoryBean.setPackagesToScan(PACKAGE_SCAN);
        sessionFactoryBean.setHibernateProperties(hibernateProperties());

        return sessionFactoryBean;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.format_sql", true);        

        //set hibernate.dialect for each datasource

        return properties;
    }
}
@配置
@启用事务管理
@授权代理(
basePackages=“com.example.multidb”,
entityManagerFactoryRef=“multiEntityManager”,
transactionManagerRef=“multiTransactionManager”
)
公共类持久化配置{
私有最终字符串包\u SCAN=“com.example.multidb”;
@初级的
@Bean(name=“maindasource”)
@ConfigurationProperties(“app.datasource.main”)
公共数据源mainDataSource(){
返回DataSourceBuilder.create().type(HikariDataSource.class).build();
}    
@Bean(name=“clientadasource”)
@ConfigurationProperties(“app.datasource.clienta”)
公共数据源ClientDataSource(){
返回DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name=“clientBDataSource”)
@ConfigurationProperties(“app.datasource.clientb”)
公共数据源clientBDataSource(){
返回DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name=“multiRoutingDataSource”)
公共数据源多路由数据源(){
Map targetDataSources=new HashMap();
put(DBTypeEnum.MAIN,maindasource());
targetDataSources.put(DBTypeEnum.CLIENT_A,clientDataSource());
targetDataSources.put(DBTypeEnum.CLIENT_B,clientBDataSource());
MultiRoutingDataSource MultiRoutingDataSource=新的MultiRoutingDataSource();
setDefaultTargetDataSource(mainDataSource());
multiRoutingDataSource.setTargetDataSources(targetDataSources);
返回多路由数据源;
}   
@Bean(name=“multiEntityManager”)
public LocalContainerEntityManagerFactoryBean multiEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(multiRoutingDataSource());
em.setPackagesToScan(包扫描);
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
em.setJpaProperties(hibernateProperties());
返回em;
}
@Bean(name=“multiTransactionManager”)
公共平台TransactionManager multiTransactionManager(){
JpaTransactionManager事务管理器
=新的JpaTransactionManager();
transactionManager.setEntityManagerFactory(
multiEntityManager().getObject());
返回事务管理器;
}
@初级的
@Bean(name=“dbSessionFactory”)
公共LocalSessionFactoryBean dbSessionFactory(){
LocalSessionFactoryBean sessionFactoryBean=新的LocalSessionFactoryBean();
setDataSource(multiRoutingDataSource());
setPackagesToScan(包扫描);
setHibernateProperties(hibernateProperties());
返回sessionFactoryBean;
}
私有属性hibernateProperties(){
属性=新属性();
properties.put(“hibernate.show_sql”,true);
properties.put(“hibernate.format_sql”,true);
//为每个数据源设置hibernate.dial
归还财产;
}
}

我已经为您创建了一个工作示例,我将在这里描述它,但是如果您想自己跳到代码中

在我的例子中,我创建了两个数据源,一个用于
User
,另一个用于
Item

在这里,实体:

package com.marcosbarbero.so.multiple.ds.entity.user;
导入龙目数据;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.Table;
@资料
@实体
@表(schema=“user”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
私有字符串名称;
@列(unique=true,nullable=false)
私人字符串电子邮件;
私人互联网;
}
package com.marcosbarbero.so.multiple.ds.entity.item;
导入龙目数据;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.Table;
@资料
@实体
@表(schema=“item”)
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串名称;
}
注意,为每个域提供不同的包是很重要的。 然后我创建了
存储库

package com.marcosbarbero.so.multiple.ds.repository.user;
导入com.marcosbarbero.so.multiple.ds.entity.user.user;
导入org.springframework.data.jpa.repository.JpaRepository;
公共接口用户存储库扩展了JpaRepository{
}
package com.marcosbarbero.so.multiple.ds.repository.item;
导入com.marcosbarbero.so.multiple.ds.entity.item.item;
导入org.springframework.data.jpa.repository.JpaRepository;
公共接口ItemRepository扩展了JpaRepository{
}
回购协议没有什么特别之处。让我们转到最后一部分,配置
multi-datasource.item.jdbcUrl=jdbc:h2:mem:spring_jpa_item;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS ITEM
multi-datasource.item.username=sa
multi-datasource.item.password=sa

multi-datasource.item.hibernate.properties.hibernate.hbm2ddl.auto=create-drop
multi-datasource.item.hibernate.properties.hibernate.cache.use_second_level_cache=false
multi-datasource.item.hibernate.properties.hibernate.cache.use_query_cache=false
multi-datasource.item.hibernate.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

multi-datasource.user.jdbcUrl=jdbc:h2:mem:spring_jpa_user;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS USER
multi-datasource.user.username=sa
multi-datasource.user.password=sa

multi-datasource.user.hibernate.properties.hibernate.hbm2ddl.auto=create-drop
multi-datasource.user.hibernate.properties.hibernate.cache.use_second_level_cache=false
multi-datasource.user.hibernate.properties.hibernate.cache.use_query_cache=false
multi-datasource.user.hibernate.properties.hibernate.dialect=org.hibernate.dialect.OracleDialect