【SpringBoot 2.3.3.RELEASE】 JPA配置使用多数据源

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);

}

猜你喜欢

转载自blog.csdn.net/qq_42158942/article/details/108326038