【问题标题】:Splitting one DB association into several collections in Hibernate在 Hibernate 中将一个 DB 关联拆分为多个集合
【发布时间】:2009-12-07 08:14:28
【问题描述】:

我正在尝试模拟这种情况 - 有一个现金转移(我的意思是一辆载钱的汽车),它需要每种货币的金额,以及每种货币的实际金额。在我看来,创建两个单独的类是没有意义的,一个用于所需数量,另一个用于实际数量。所以实现看起来像这样:

@Entity
public class CashTransferCurrencyAmount {
    // id, version and so on

    @Column(length = 3)
    private String currencyCode;

    @Basic
    private BigDecimal amount;

    @ManyToOne
    private CashTransfer cashTransfer;
}

@Entity
public class CashTransfer {
    // id, version and so on

    @OneToMany(mappedBy="cashTransfer")
    private Set<CashTransferCurrencyAmount> requiredCurrencyAmountSet = new HashSet<CashTransferAmountCurrency>();

    @OneToMany(mappedBy="cashTransfer")
    private Set<CashTransferCurrencyAmount> actualCurrencyAmountSet = new HashSet<CashTransferAmountCurrency>();
}

但是 CashTransferCurrencyAmount 实例如何知道它属于哪个集合?我有两个想法:

1 - 向 CashTransferCurrencyAmount 添加一个鉴别器字段:

public enum RequestType {
    ACTUAL,
    REQUIRED
}

@Basic
@Enumerated(EnumType.STRING)
private RequestType requestType;

并将@WHERE 注释添加到CashTransfer 中的集合。这对我来说更可取。

2 - 创建两个连接表。一种用于映射请求的金额,另一种用于映射实际金额。我不喜欢这个,因为我不想在我的数据库中有太多的表。

还有其他方法可以实现吗?我这个方法对吗?
不要告诉我将请求的金额和实际金额都放在一个实体中。实际情况更复杂,每个CashTransferCurrencyAmount 都有自己的集合,所以不能这样解决。

编辑
至于完整故事的请求 - CashTransferCurrencyAmount 中曾经有两个值 - 必需(我认为它应该是“请求的”)和实际值,但现在每个金额都有自己的集合 - 这个金额如何分成面额。所以我需要一个数量的集合,每个数量都有一个面额的集合。 CurrencyAmount 和 CurencyDenomination 的类型似乎与请求的类型和实际的类型相同。

【问题讨论】:

  • 您是说实际和请求的货币数量在您的实际模型中属于不同类型吗?如果是这样,他们是否不需要单独的表格?你没有给我们完整的故事,所以我发现很难就一个好的模型给你建议。

标签: java hibernate collections mapping


【解决方案1】:

由于您希望 CashTransferCurrencyAmount 实例知道它属于哪个集合,我假设您希望有一些基于此的逻辑。我模拟您的情况的方式是使用继承。

您是说“在我看来创建两个单独的类毫无意义”,但是我会尝试说服您应该这样做。您可以使用“单表”继承类型,这样您就不会在数据库中引入额外的表,而这正是您想要完成的。

我的镜头看起来像:


@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "request_type", discriminatorType = DiscriminatorType.STRING)
public abstract class CashTransferCurrencyAmount {
    // id, version and so on

    @Column(length = 3)
    private String currencyCode;

    @Basic
    private BigDecimal amount;

    @ManyToOne
    private CashTransfer cashTransfer;
}

@Entity
@DiscriminatorValue("REQUIRED")
public class CashTransferCurrencyAmountRequired extends CashTransferCurrencyAmount {
    // required anount specific stuff here
}

@Entity
@DiscriminatorValue("ACTUAL")
public class CashTransferCurrencyAmountActual extends CashTransferCurrencyAmount {
    // actual anount specific stuff here
}

@Entity
public class CashTransfer {
    // id, version and so on

    @OneToMany(mappedBy="cashTransfer")
    private Set requiredCurrencyAmountSet = new HashSet();

//Stackoverflow deleting my generic sets! But it's exactly the same as in your code...

    @OneToMany(mappedBy="cashTransfer")
    private Set actualCurrencyAmountSet = new HashSet();
}

【讨论】:

  • 我不够精确。我应该写“Hibernate 如何知道将每个 CashTransferCurrencyAmount 放入哪个集合”。实例是一样的。但是在单表中包含子类的想法很有趣。至少 Hibernate 会自己做这种区分工作。
  • 我终于决定使用判别器和 where 子句,但我喜欢你的回答,而且它是唯一的,所以我接受了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多