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

我有一个带有一个实体和一个与此实体相关联的存储库的Spring

Boot项目。在存储库中,有一个带有自定义查询的方法,在项目控制器中,该存储库用于从不同的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);

}

这是控制器

@RequestMapping(value="/ricercaadesioni/{codicefiscale}", method=RequestMethod.GET)

public ResponseEntity<List<Request>> ricercaAdesioniByCodiceFIscale(@PathVariable("codicefiscale") String codicefiscale) {

List<Request> listAdesioni = requestRepo.findByCodiceFiscale(codicefiscale);

return new ResponseEntity<List<Request>>(listAdesioni, HttpStatus.OK);

}

这是application.properties(在这种情况下,数据源仅引用一个db):

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

spring.datasource.username=xxx

spring.datasource.password=xxx

希望一切都清楚

回答:

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

在您的属性文件中,有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

step2>然后为第一个数据源创建配置文件

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

}

}

step3>类似地为其他dataSource创建另一个配置文件,

@EnableJpaRepositories(

entityManagerFactoryRef = "entityManagerFactory",

basePackages = { "com.package2.repo" }

并更改前缀

@ConfigurationProperties(prefix = "spring.datasource2")

现在,如上所述,在package1和package2中分别将有两个类似的RequestRepository1和RequestRepository2(basePackages

= {“ com.package1.repo”})。

step4>全部设置autowire 2不同的仓库。

@Autowired

private final RequestRepository1 repo1;

@Autowired

private final RequestRepository2 repo2;

然后使用它们。

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

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

以上是 Spring Boot-用于不同数据库的相同存储库和相同实体 的全部内容, 来源链接: utcz.com/qa/409620.html

回到顶部