java - 在休眠子类中使用 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 方法中给了我错误,因为被覆盖的方法不能有不同的返回类型。
解决方案
实际上,您的问题是您使用的字段与超类中的字段同名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;
}
}
笔记:
您的类中需要有两个类型的对象Order
,Offer
一个用于映射,offer
第二个用于offers
映射,请注意mappedBy = "order1"
映射中的 。
推荐阅读
- swift - 将 NSTableView 与可可绑定和领域一起使用
- python - 使用函数和 while 循环构建的不完整字典列表
- python-3.x - 在 Python 中使用 'dpkg' 会导致 OSError: [Errno 9] Bad file descriptor
- swift - 分配给 NSMenuItem 的操作似乎不起作用
- servicestack - 如何使用 ServiceStack 设置 Cache-Control?
- mpandroidchart - MPAndroidChart 如果值超过常数,我想更改点颜色
- symfony - Symfony:加载 .env.test 文件
- python-3.x - Openpyxl 2.6.0 保存问题
- sparql - 维基数据中语义相似性的 SPARQL 查询超时
- r - 在 R 中初始化依赖包的正确方法,例如使用 ggmap