【问题标题】:How to connect same entity with different tables (Spring Boot)如何将同一实体与不同的表连接起来(Spring Boot)
【发布时间】:2018-01-25 13:39:59
【问题描述】:

我正在围绕加密货币进行一些研究,在谈到它的技术方面时,我发现了一个可能更常见的问题,并且有人已经找到了解决方案。

我找到了一个按产品包含历史信息的数据库,它针对不同的组合有不同的表,但表的结构是相同的。

我设计了这个 DBO,没有什么火箭科学:

public class ProductHistoryDbo {
    private long id;
    private long startTime;
    private long endTime;
    private float low;
    private float high;
    private float open;
    private float close;
    private float volume;
}

并且数据库每个 (exchange, currency_in, currency_to) 有一个表

product_history_gdax_bch_btc
product_history_gdax_bch_eur
...

有 12 个结构相同的表格,另外还有一个包含您可以在其中找到的所有其他表格。

所以我的想法是只有一个实体和存储库,但如果可能的话,动态更改在 spring-boot 中从哪个表中检索数据,以便在将来添加新表而不需要添加样板时进行调整代码。

最终的 E2E 将拥有一个带有组合框的管理页面,其中包含将向该服务器发出请求的所有元组,并且数据库中的更改不会意味着后端代码的更改。

【问题讨论】:

  • 我认为没有一种干净的方法可以做到这一点。为什么不简单地将exchange, currency_in, currency_to 保留为ProductHistoryDbo 状态的一部分?如果你关心性能,你可以考虑创建一个由这三个属性组成的索引(显然,这是否能提高性能取决于读/写比率)
  • @crizzis 因为我无法控制这些表
  • 您不能将两个表映射到同一个实体。你必须创建两个。
  • 在这种情况下,我看到的唯一解决方法是按照@SimonMartinelli 的建议为每个类创建一个实体,并使用ProductHistoryDbo 作为@MappedSuperclass

标签: database jpa spring-boot spring-data


【解决方案1】:

您可以创建一个基类,然后扩展它,每个最终类的唯一区别是表名。

基类:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Lut implements BaseCrudEntity<Long> {

}

子类:

package xxx.lut;
import javax.persistence.*;

@Entity
@Table(name = "rwx_gnrl_lut_dm")
public class LutDm extends Lut {

}

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2019-11-25
    • 1970-01-01
    • 2013-07-08
    • 2019-05-14
    • 1970-01-01
    • 2018-07-06
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多