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 的设计。
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |