首页 > 解决方案 > 在休眠子类中使用 OneToMany 映射覆盖 OneToOne

问题描述

我在数据库订单和报价中有两个表。早些时候有两个之间的@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 方法中给了我错误,因为被覆盖的方法不能有不同的返回类型。

标签: javahibernatejpainheritancehibernate-mapping

解决方案


实际上,您的问题是您使用的字段与超类中的字段同名offer,而两者都具有不同的类型,因此会令人困惑,因为您将拥有子 getter 来Set<Offer>覆盖父 getter for Offer,这就是您得到的原因例外:

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;
    }
}

笔记:

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


推荐阅读