配置文件
# mian DB properties:
main.datasource.jdbcUrl=jdbc:mysql://localhost:3306/emipe?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
main.datasource.username=root
main.datasource.password=root
main.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# other DB config
other.datasource.jdbcUrl=jdbc:mysql://192.168.20.77:3306/gaea_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
other.datasource.username=root
other.datasource.password=1qaz369*
other.datasource.driverClassName=com.mysql.cj.jdbc.Driver
配置数据源dataSource
@Configuration
public class DataSourceConfig {
// 注意,这里需要有一个@Primary注解,
// 告诉框架有两个实现类的时候优先选择这个实现类,
// 如果不使用会报错“required a bean of type 'org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties' that could not be found.”
@Primary
// @Bean后面的括号的内容可有可无,因为我这里的写法很规范,方法名就是mainDataSource
// 如果不一样需要@Bean加上声明的变量名称
@Bean("mainDataSource")
@ConfigurationProperties(prefix = "main.datasource")
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}
@Bean("otherDataSource")
@ConfigurationProperties(prefix = "other.datasource")
public DataSource otherDataSource() {
return DataSourceBuilder.create().build();
}
}
配置EntityManagerFactory和TransactionManager
第一个数据源的配置
/**
* @author caicai
* @create 2021/6/4
*/
@Configuration
// 启用事务管理注解
@EnableTransactionManagement
// 启用JPA仓库注解,
// 其中第一个属性对应Bean名称为”mainEntityManagerFactory“的对象,声明了该数据源所使用的对象管理类工厂
// 第二个属性声明事务管理器,对应名称为”mainTransactionManager“的JavaBean
// 第三个属性表示dao层所在的包
@EnableJpaRepositories(entityManagerFactoryRef = "mainEntityManagerFactory", transactionManagerRef = "mainTransactionManager",
basePackages = {"com.caicai.emipe.persistence.main"})
public class MainDataSourceConfig {
@Autowired
@Qualifier("mainDataSource")
private DataSource mainDataSource;
@Autowired(required = false)
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
// 配置EntityManagerFactory,因为一共有两个数据源,
// 其中一个在配置EntityManagerFactory时需要加@Primary注解
@Primary
@Bean(name = "mainEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(mainDataSource)
//设置entity所在位置
.packages("com.caicai.emipe.persistence.main")
.persistenceUnit("mainPersistenceUnit")
.properties(getVendorProperties())
.build();
}
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
// 配置事务管理器,也需要添加@Primary注解
@Primary
@Bean(name = "mainTransactionManager")
public PlatformTransactionManager mainTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(mainEntityManagerFactory(builder).getObject());
}
}
第二个数据源的配置
/**
* @author caicai
* @create 2021/6/4
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "otherEntityManagerFactory", transactionManagerRef = "otherTransactionManager",
basePackages = {"com.caicai.emipe.persistence.other"})
public class OtherDataSourceConfig {
@Autowired
@Qualifier("otherDataSource")
private DataSource otherDataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Bean(name = "otherEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean otherEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(otherDataSource)
.packages("com.caicai.emipe.persistence.other")
.persistenceUnit("otherPersistenceUnit")
.properties(getVendorProperties())
.build();
}
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
@Bean(name = "otherTransactionManager")
public PlatformTransactionManager otherTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(otherEntityManagerFactory(builder).getObject());
}
}
Entity和Repository
根据之前的配置位置写入实体类和Repository,这个就跟平常使用Jpa一样,对应的表名不要写串了
版权声明:本文为weixin_44712778原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。