1.写配置文件,application.yml
# 多数据源配置
spring:
datasource:
ds1:
driverClassName: org.postgresql.Driver
jdbc-url: jdbc:postgresql://xxxxx:5432/bigdata?currentSchema=public
username: xxx
password: xxx
ds2:
driverClassName: org.postgresql.Driver
jdbc-url: jdbc:postgresql://xxxxx:5432/bigdata2?currentSchema=public
username: xxx
password: xxx
jpa:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
open-in-view: true
show-sql: true
database-platform: org.hibernate.dialect.PostgreSQLDialect
2.写配置类
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.ds1")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondDataSource")
@Qualifier("secondDataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.ds2")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
网上多数据源教程一般是老版的,方法jpaProperties.getHibernateProperties() 已经弃用了。
我这个配置新版可以用。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {
"com.xxx.dao.ds1"}) //设置Repository所在位置
public class PrimaryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
return builder
.dataSource(primaryDataSource)
.properties(properties)
.packages("com.xxxx.entity.ds1") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorySecond",
transactionManagerRef = "transactionManagerSecond",
basePackages = {
"com.xxx.dao.ds2"}) //设置Repository所在位置
public class SecondConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Autowired
@Qualifier("secondDataSource")
private DataSource secondDataSource;
@Bean(name = "entityManagerSecond")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecond(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactorySecond")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecond(EntityManagerFactoryBuilder builder) {
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
return builder
.dataSource(secondDataSource)
.properties(properties)
.packages("com.xxx.entity.ds2") //设置实体类所在位置
.persistenceUnit("secondPersistenceUnit")
.build();
}
private Map getVendorProperties(DataSource dataSource) {
return jpaProperties.getProperties();
}
@Bean(name = "transactionManagerSecond")
public PlatformTransactionManager transactionManagerSecond(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactorySecond(builder).getObject()));
}
}
3.写Entity,不同包对应不同数据源
@Id//主键
@Column//属性映射
@GeneratedValue(strategy = GenerationType.AUTO)//说明主键id自增
@Transient//非数据库字段
@Entity
@Data
@Table(name = "meta_data")
public class MetaData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String aliasname;
private String name;
private String crs;
private Double height;
...
@Column(name = "max_x")
private Double max_x;
...
@Transient
private ReferencedEnvelope BBox;
}
4.写Dao,不同包对应不同数据源
@Repository
public interface MetaDataDao extends JpaRepository<MetaData,String> {
@Query(value = "select * from meta_data where name=?1",nativeQuery = true)
MetaData findByName(String name);
}