簡體   English   中英

在休眠子類中使用OneToMany映射覆蓋OneToOne

[英]Overriding OneToOne with OneToMany Mapping in Hibernate Child Class

我在數據庫訂單和報價中有兩個表。 早先在兩個之間有@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方法中給我錯誤,因為重寫的方法不能具有不同的返回類型。

其實你的問題是,你正在使用的字段名稱相同的offer作為超類,而兩者有不同類型的領域,所以這將是令人困惑,因為你將不得不為孩子的吸氣Set<Offer>覆蓋父消氣Offer ,這就是為什么您獲得例外的原因:

getter方法中的錯誤,因為重寫的方法不能具有不同的返回類型

您在這里要做的是為子類中的字段使用一個不同的名稱,例如offers ,因此Model將是正確的,而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"中的映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM