【问题标题】:How to use mappedBy with more than one value JPA如何使用具有多个值 JPA 的 mappedBy
【发布时间】:2016-05-03 18:03:46
【问题描述】:

我有 2 张桌子: 货币和汇率

货币的主键被 Rate 中的 inputCurrency 和 outputCurrency 外键引用。

如何将这些映射到 cascadeALL?

我在 Rate(包含前键的表)中尝试过

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "INPUT_CURRENCY")
private Currency inputCurrency;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "OUTPUT_CURRENCY")
private Currency ouputCurrency;

但是,如果我从货币中删除一个项目,则会导致主键违规。我无法删除货币,因为它被输入货币或输出货币的汇率引用。

如果我想用 Currency 来注释汇率列表,我该怎么说 mappedBy = "inputCurrency" 和 "outputCurrency" ?

@OneToMany(cascade = CascadeType.ALL,mappedBy ="inputCurrency,outputCurrency")
List<Rate> rates;

【问题讨论】:

  • 显然您不能将 mappedBy 与多个值一起使用,因为它没有任何意义。 "mappedBy" = "这个双向关系存储在哪里" ...而且不能存储在多个地方!

标签: jpa jpa-2.1 mappedby


【解决方案1】:

解决方案是使用两个货币汇率列表:一个用于 fk inputCurrency 另一个用于 fk outputCurrency

@OneToMany(cascade = CascadeType.ALL,mappedBy ="inputCurrency")
List<Rate> ratesIC;

@OneToMany(cascade = CascadeType.ALL,mappedBy ="outputCurrency")
List<Rate> ratesOC;

【讨论】:

    【解决方案2】:

    您可以使用两个集合来解决:

    List&lt;Rate&gt; inputRate;

    List&lt;Rate&gt; outputRate;

    每个都有对应的mappedBy

    第三个@Transient List&lt;Rate&gt; rates;

    您可以使用@PostLoad 事件将两个持久列表合并为临时列表。

    同样,当向其中一个持久列表添加/删除元素时,请确保从联合列表中添加/删除。

    【讨论】:

    • 感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2017-01-23
    • 2017-01-23
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多