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
@配置实现
,我可以如何在运行时为每个数据源动态设置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