使用休眠的多态“多”(多对一)InheritanceType.JOINED

Fre*_*ers 5 polymorphism inheritance hibernate

我有这样的东西。

具有多个座位中一个座位的Car类。座椅有一个子类LeatherSeat。

public class Car {
  private Seat seat;
  ...
  @ManyToOne(fetch = FetchType.LAZY)
  public Seat getSeat() {
    return seat;
  }
  ...
}

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Seat {
  private String id;
  private String color;
} 

@Entity
public class LeatherSeat extends Seat {
    private String leatherType;
}
Run Code Online (Sandbox Code Playgroud)

当我创建自己的汽车并将我的汽车座椅设为LeatherSeat时,它会将所有正确保存在数据库中。当我想要拿车(使用条件或查询列表)并且阅读getSeat()时,Seat始终只是一个席位,而不是LeatherSeat。我无法投射(例外),而且看来必须通过ID手动获取LeatherSeat。

这是使用JOINED继承类型的限制,还是我缺少某些内容。我如何获得真皮座椅的座位?

小智 1

看起来,如果您执行惰性获取,就像您使用 getSeat 所做的那样,您将只能获得父类,而永远不会获得子类。我使用 FetchType.EAGER 尝试了相同的示例,并且 getSeat 正确返回了 LeatherSeat。

我不确定为什么 hibernate 在进行 EAGER 获取时可以获取带有 LeatherSeat 的汽车,但在进行 LAZY 获取时 hibernate 似乎无法获取它。那里好像有什么东西坏了。

有一个关于 InheritanceType.JOINED 上的鉴别器列的票证,其中针对此场景提出了观点。 https://hibernate.onjira.com/browse/ANN-140但票被拒绝,表明 hibernate 太优雅了,不需要 InheritanceType.JOINED 的鉴别器。然而,它无法在延迟获取时正确返回子类。

那么这张票https://hibernate.onjira.com/browse/HHH-271?focusedCommentId=44089#comment-44089更具体地针对这个问题,答案是“我们如何知道要获取什么子类”懒惰地取东西?

两张票都是旧票并且被拒绝。对我来说似乎是个问题。但现在您必须更改为不同的继承类型或使用 eager fetch 类型,因为这是根据 hibernate 的设计。