gpt4 book ai didi

java - 使用 Hibernate 的 Spring Boot 应用程序如何与多个结构相同的表进行交互?

转载 作者:行者123 更新时间:2023-11-30 21:32:44 24 4
gpt4 key购买 nike

我有一个名为“currency”的 MySQL 数据库,有一百多个表,每个表代表一种货币,并且所有表都具有相同的结构(2 列,时间戳的日期时间和汇率的 float )。

Spring Boot 应用程序如何与此结构交互?

我只想拥有一个带有字段和 getter/setter 方法的 CurrencyRate 类。如果我将这个类标记为@Entity@Table,那么我只能访问一个表。我研究了 @SecondaryTable 标记,但它似乎只适用于我们希望同时与多个表交互的情况,而不仅仅是一个表。

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Id;
import javax.validation.constraints.NotBlank;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.databind.ser.std.NumberSerializers.FloatSerializer;

public abstract class CurrencyRate implements Serializable {

@Id
@JsonSerialize(using=DateSerializer.class)
private Date datetime;

@NotBlank
@JsonSerialize(using=FloatSerializer.class)
private float rate;

Date getDate () { return this.datetime; }
void setDate (Date timestamp) { this.datetime = timestamp; }
float getRate () { return this.rate; }
void setRate (float rate) { this.rate = rate; }
}

我想到我可以将 CurrencyRate 设为一个抽象类(如提供的图片所示),然后为从此类继承的每种货币创建一个类。这将非常乏味,但至少它可能会起作用。但是,似乎我不仅需要为每个货币模型创建一个类,而且还需要为每个存储库创建一个类。

除非有一种方法可以在不做所有这些的情况下为这个结构提供服务?有任何想法吗?目前正在查看文档并搜索其他有此问题的人,但这种结构似乎并不常见。

编辑:

我想添加 Controller ,因为我相信这是区分抽象类的子级的逻辑问题发生的位置。

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/rates")
class CurrencyRateController {

@Autowired
private CurrencyRateService service;

@GetMapping("/allEUR")
public List<CurrencyRate> getAllEUR() {
return service.findAll();
}

@GetMapping("/allCAD")
public List<CurrencyRate> getAllCAD() {
return service.findAll();
}
}

上面的 Controller 返回/allCAD 和/allEUR 的 CAD 值,我假设是因为 CurrencyRateService 使用 CurrencyRateRepository。在某处,Hibernate 试图区分 EUR 子类和 CAD 子类,但它们是相同的。因此,所有请求都会给出 CAD 值。

最佳答案

可能您必须使用正确的继承策略。像这样:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class CurrencyRate {
(... omitted for brevity ...)
}

子类:

@Entity
@Table(name="USDOLLAR")
public class UnitedStatesDollar extends CurrencyRate {
}

@Entity
@Table(name="EURO")
public class Euro extends CurrencyRate {
}

其他货币也一样。您应该能够查询 CurrencyRate 类,从所有表中检索所有结果,并且您必须使用 instanceof 来区分货币。您还可以针对单一货币执行查询。

如果您想了解有关继承的更多信息,请查看 here .

关于java - 使用 Hibernate 的 Spring Boot 应用程序如何与多个结构相同的表进行交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com