Spring Boot-不同数据库的相同存储库和相同实体

Spring Boot-不同数据库的相同存储库和相同实体,spring,postgresql,spring-boot,spring-data,Spring,Postgresql,Spring Boot,Spring Data,我有一个SpringBoot项目,其中有一个实体和一个与该实体关联的存储库。在存储库中有一个方法具有自定义查询,在项目控制器中,该存储库用于从不同的postgresql数据库返回数据。这些数据库具有相同的表和相同的列(因此引用的实体是相同的),这些数据库之间的唯一区别是年份(…、DB2015、DB2016、DB2017)。 我的问题是:如何在项目控制器中返回属于“不同”数据库的数据?是否可以使用同一个查询最初从第一个数据库中选择数据,然后从第二个数据库中选择数据,依此类推? 在其他问题中,我读到

我有一个SpringBoot项目,其中有一个实体和一个与该实体关联的存储库。在存储库中有一个方法具有自定义查询,在项目控制器中,该存储库用于从不同的postgresql数据库返回数据。这些数据库具有相同的表和相同的列(因此引用的实体是相同的),这些数据库之间的唯一区别是年份(…、DB2015、DB2016、DB2017)。 我的问题是:如何在项目控制器中返回属于“不同”数据库的数据?是否可以使用同一个查询最初从第一个数据库中选择数据,然后从第二个数据库中选择数据,依此类推? 在其他问题中,我读到我需要不同的数据源,这是正确的吗

这是实体:

@Entity(name = "REQUEST")
public class Request implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@Column(name="IDREQUEST", nullable=false)
private BigDecimal idrequest;


@Column(name="PAYLOAD")
private String payload;

@Column(name="MITTENTE")
private String mittente;

@Column(name="SERVIZIO")
private String servizio;

@Column(name="DATARICEZIONE")
private BigDecimal dataricezione;

public BigDecimal getIdrequest() {
    return idrequest;
}

public void setIdrequest(BigDecimal idrequest) {
    this.idrequest = idrequest;
}

public String getPayload() {
    return payload;
}

public void setPayload(String payload) {
    this.payload = payload;
}

public String getMittente() {
    return mittente;
}

public void setMittente(String mittente) {
    this.mittente = mittente;
}

public String getServizio() {
    return servizio;
}

public void setServizio(String servizio) {
    this.servizio = servizio;
}

public BigDecimal getDataricezione() {
    return dataricezione;
}

public void setDataricezione(BigDecimal dataricezione) {
    this.dataricezione = dataricezione;
}

}
这是存储库:

@Repository
public interface RequestRepository extends PagingAndSortingRepository<Request, BigDecimal> {

    @Query(nativeQuery=true, value="SELECT * FROM \"REQUEST\" WHERE strpos(\"PAYLOAD\",\'?1\') > 0")
    List<Request> findByCodiceFiscale(String codiceFiscale);

}

希望一切都清楚

使用不同的数据源创建2个配置文件,这2个配置文件将对2个不同的jpa存储库类具有不同的规范。但可以具有相同的域类

步骤1> 在属性文件中有2个数据源详细信息

spring.datasource.url=jdbc:postgresql://localhost:5432/DB2017_test
spring.datasource.username=xxx
spring.datasource.password=xxx


# DB2018 DB - ""
spring.datasource2.url=jdbc:postgresql://localhost:5432/DB2018_test
spring.datasource2.username=xxx
spring.datasource2.password=xxx
步骤2>然后为第一个数据源创建配置文件

package com.package1;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.package1.repo" } 
)
public class DB2017Config {

  @Primary
  @Bean(name = "dataSource")
  @ConfigurationProperties(prefix = "spring.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean 
  entityManagerFactory(
    EntityManagerFactoryBuilder builder,
    @Qualifier("dataSource") DataSource dataSource
  ) {
    return builder
      .dataSource(dataSource)
      .packages("com.domain")
      .persistenceUnit("foo")
      .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory 
    entityManagerFactory
  ) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}
步骤3>类似地为其他数据源创建另一个配置文件

@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.package2.repo" }
并更改前缀

@ConfigurationProperties(prefix = "spring.datasource2")
现在,在package1和package2中分别有2个类似的RequestRepository1和RequestRepository2,如上所述(basePackages={“com.package1.repo”})

步骤4>所有设置autowire 2不同的回购

@Autowired
private final RequestRepository1  repo1;
@Autowired
private final RequestRepository2  repo2;
然后使用它们

List<Request> listAdesioni = repo1.findByCodiceFiscale(codicefiscale);
List<Request> listAdesioni = repo2.findByCodiceFiscale(codicefiscale);
List listadesoni=repo1.findByCodiceFiscale(codicefiscale);
List listAdesioni=repo2.findByCodiceFiscale(codicefiscale);

您可以定义多个
LocalContainerEntityManagerFactoryBean
bean,每个bean都有与所需数据库关联的数据源。我有6个不同的数据源用于1个模型。。。有比复制存储库更好的解决方案吗?它有点旧。。。总是推荐吗?我害怕使用本地线程。它与事务上下文兼容。。。我在这方面找到了一些很好的资源。实际上,这似乎是最好的解决办法。资源:和。
@Autowired
private final RequestRepository1  repo1;
@Autowired
private final RequestRepository2  repo2;
List<Request> listAdesioni = repo1.findByCodiceFiscale(codicefiscale);
List<Request> listAdesioni = repo2.findByCodiceFiscale(codicefiscale);