【问题标题】:Overriding OneToOne with OneToMany Mapping in Hibernate Child Class在 Hibernate 子类中使用 OneToMany 映射覆盖 OneToOne
【发布时间】:2018-08-17 11:23:32
【问题描述】:

我在数据库订单和报价中有两个表。早些时候有两个之间的@OneToOne 映射,即对于一个订单,有一个报价。对应的域是:

@Entity
@Table(name = "orders")
@DiscriminatorFormula("0")
@DiscriminatorValue("0")
class Order {

    @OneToOne(mappedBy = "order", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    private Offer offer;

    public Offer getOffer() {
        return this.offer;
    }

    public void setOffer(Offer offer) {     
        this.offer = offer;
    }
}

@Entity
@Table(name = "offers")
class Offer {

}

现在,我想要两个之间的 OneToMany 映射,即对于单个订单,现在可以有多个报价。但为此,我想构建新版本的 Domain 以免影响现有功能。因为它是 OneToMany 映射,所以我将不得不使用 Set 或 List。所以,实际上,我想要这样做:

@Entity
@DiscriminatorValue("00")
class OrderV2 extends Order {

    @OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    private Set<Offer> offer;

    public Set<Offer> getOffer() {
        return this.offer;
    }

    public void setOffer(Set<Offer> offer) {        
        this.offer = offer;
    }
}

我该如何实现这一点,因为目前它在 getter 方法中给了我错误,因为被覆盖的方法不能有不同的返回类型。

【问题讨论】:

  • 愚蠢的想法。它是 1-1 或 1-N,而不是两者。 OrderV2 也是 Order,现在 BOTH 字段也是如此。在肮脏的黑客攻击之前设计您的模型

标签: java hibernate jpa inheritance hibernate-mapping


【解决方案1】:

实际上,您的问题是您使用的字段与超类中的字段名称相同 offer,而两者具有不同的类型,因此会造成混淆,因为您将有 Set&lt;Offer&gt; 覆盖的子 getter Offer 的父 getter,这就是你得到异常的原因:

getter 方法出错,因为被覆盖的方法不能有不同的返回类型

您必须在这里为您的子类中的字段使用不同的名称,例如offers,这样模型将是正确的,而 Hibernate 将正确映射对象:

@Entity
@DiscriminatorValue("00")
class OrderV2 extends Order {

    @OneToMany(mappedBy = "order1", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    private Set<Offer> offers;

    public Set<Offer> getOffers() {
        return this.offers;
    }

    public void setOffers(Set<Offer> offers) {        
        this.offers = offers;
    }
}

注意:

您的Offer 类中需要有两个Order 类型的对象,一个用于offer 的映射,第二个用于offers 映射,注意映射中的mappedBy = "order1"

【讨论】:

  • 感谢您的回答。我尝试了相同的方法,但是当为单个订单找到两个报价时,我得到了休眠错误“找到了多个具有给定标识符的行”。我认为它正在发生,因为报价字段(带有 OneToOne 映射)正在扩展到 OrderV2 域。我想要的是在子类中使用 OneToMany 映射覆盖 OneToOne 映射。
  • @user2557608 在这种情况下,简短的回答是不可能,正如我所说的,子类中的新字段覆盖了父类中的字段,因此他们需要有相同的类型,你不能这样做你需要另一个字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多