首页 > 解决方案 > JPA继承设计问题

问题描述

我正在尝试使用以下数据模型的继承来创建 JPA 实体。我有一个带有 ID、开始和结束日期的价格表。有不同的定价类型,例如按小时向用户收费的标准价格和根据销售量向他收费的批量价格。在等级价格的情况下,相同的价格条目有多个条目。例如,如果交易量为 0 到 100 则为 1 美元,101 到 1000 的价格为 1.25 美元,超过 1000 则为 1.50 美元。下面是我的数据模型

Price
ID
Start_Date
End_Date

Standard Price
ID
price_id(FK)
price

Tier Price
ID
Price_id (FK)
start_tier
end_tier

我正在尝试使用 Spring Boot 和 JPA 保留价格详细信息并对实体进行建模。我打算使用继承策略,将价格基类和标准和等级价格作为子类。我正面临 Tier Price 子类的问题,因为多行一起形成一个单一的价格条目。以下是我在模型中可视化的内容,但这可能不适用于 Enity。有没有办法创建一个实体来满足以下要求,或者唯一的方法是通过引入新表来更改数据模型来分组层信息。

public class TierPriceHolder extends price{

private List<Tiers> price;

}

标签: hibernatejpa

解决方案


我不打算评论在这样的平面表中嵌套结构化信息是否是一个合理的想法,但如果你想将它们全部保存在一个表中,你只需要一个额外的父实体对分层价格进行分组:

public class VolumePrice extends Price {

   @OneToMany
   @JoinColumn(name = "volume_price_id")
   private Collection<TierPrice> tiers;
}

使用这样的层次结构,您将简单地获得一个父行,其中多个子行指向它,所有这些都在同一个表中:

+----+----------+-----------------+------------+-------------+------------+----------+-------------+
| id | price_id | volume_price_id | start_date | end_date    | start_tier | end_tier | DTYPE       |
+----+----------+-----------------+------------+-------------+------------+----------+-------------+
| 1  |          |                 | 1 Jan 2020 | 31 Dec 2020 |            |          | Price       |
+----+----------+-----------------+------------+-------------+------------+----------+-------------+
| 2  | 1        |                 |            |             |            |          | VolumePrice |
+----+----------+-----------------+------------+-------------+------------+----------+-------------+
| 3  |          | 2               |            |             | 0          | 100      | Tier        |
+----+----------+-----------------+------------+-------------+------------+----------+-------------+
|    |          | 2               |            |             | 101        | 200      | Tier        |
+----+----------+-----------------+------------+-------------+------------+----------+-------------+

(我仍然对 的含义感到困惑price_id,但我希望你能大致了解)


推荐阅读