在休眠子类中使用OneToMany映射覆盖OneToOne

时间:2018-08-17 11:23:32

标签: java hibernate jpa inheritance hibernate-mapping

我在数据库订单和报价中有两个表。早些时候在两个之间有@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 个答案:

答案 0 :(得分:0)

实际上,您的问题是您正在使用与超类中的字段具有相同名称的offer字段,但两者都具有不同的类型,因此这会造成混淆,因为您将拥有{{ 1}}覆盖Set<Offer>的父getter,这就是为什么您得到异常的原因:

  

getter方法中的错误,因为重写的方法不能具有不同的返回类型

您在这里要做的是为子类中的字段使用其他名称,例如Offer,这样Model将是正确的,而Hibernate将正确地映射对象:

offers

注意:

@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; } } 类中需要有两个Order类型的对象,一个对象用于Offer的映射,第二个对象用于offer的映射,请注意{ {1}}。