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