![](/img/trans.png)
[英]Hibernate mapping: OneToMany and OneToOne on child object property
[英]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;
}
}
注意:
你需要有兩類對象Order
在Offer
類,一個用於映射offer
和第二的offers
映射,注意mappedBy = "order1"
中的映射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.