当前位置: 首页 > 面试题库 >

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

申屠鹏
2023-03-14
问题内容

我有一个带有一个实体和一个与此实体相关联的存储库的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);


 类似资料:
  • 我需要帮助设置一个应用程序,该应用程序将内部(主)MS SQL数据库DB1中的数据子集复制到另一个MySQL数据库DB2中,该数据库在Web服务器上运行,供Web应用程序使用(即,我想同步这两个数据库)。这两个数据库上的表具有相同的名称,尽管DB2上只定义了属性/列的子集。我想使用(xml配置的)spring、spring data jpa(即JpaRepository接口)和hibernate作

  • 如标题所示,我有一个用例,我将把数据写到firestore和realtime数据库中。我将实时数据库用于需要实时反馈给用户的操作,并将firestore用于存储数据,这些数据不会真正改变,但可以在以后为更复杂的操作查询。

  • 使用JDBC驱动程序,我如何使用来自不同查询的多个结果集,而不不断地打开和关闭连接,因为我正在提取所需的w.e并将其传递给另一个方法。每次打开新的conn、语句和结果集时 我试图在一个方法中使用多个结果集,但它一直抛出异常,称结果集已关闭。我没有太多的SqlServver经验,所以任何指导都会有所帮助:-)

  • 编辑:最后一个问题,如何通过值而不是引用来存储它?

  • 当我启动应用程序时,我得到一个错误,即找不到。 然后我把它添加到我的SpringBootApp中 并且找到,但没有找到。 存储库

  • 我正在思考架构组件/MVVM。 假设我有一个存储库、一个ViewModel和一个片段。我使用类作为包装器来公开网络状态,就像体系结构组件指南中建议的那样。 我的存储库目前看起来是这样的(为简洁起见进行了简化): 然后在ViewModel中,我还声明了一个可变LiveData: 最后,片段: 正如您所看到的,由于LiveData变量将在过程中重置(存储库将创建一个新实例),因此不会触发观察者会出现问

  • 问题内容: 我们在项目中使用MYSQL和Hibernate。 JPA用于将对象持久存储在DB中。 我们有多个具有相似代码的类 现在我们也想对oracle提供支持。我们应该怎么做?oracle不支持strategy = GenerationType.AUTO。 一个解决方案是我们可以在每个POJO中定义我们不想做的序列吗? 请提供一些建议,以便我们继续前进。 问题答案: AUTO策略也应适用于Ora

  • 问题内容: 当我发现有时候,不同的类实例位于相同的内存位置时,我正在玩图书馆。 下面的两个示例都展示了上述行为: 这让我很吃惊,所以也许您可以 解释为什么发生这种情况 。 该程序按我期望的方式运行,如下所示。 问题答案: 您的问题与Python如何分配内存有关。 tldr; Python使用堆来存储内存。释放资源后,它会到达堆的顶部。 Python必须分配内存来创建对象的实例。为了提高内存效率,P