多态性';获取';使用hibernate,多对一,InheritanceType.JOINED
我有这样的东西 多个座位中有一个座位的汽车级别。座椅有一个子类皮革座椅多态性';获取';使用hibernate,多对一,InheritanceType.JOINED,hibernate,inheritance,polymorphism,Hibernate,Inheritance,Polymorphism,我有这样的东西 多个座位中有一个座位的汽车级别。座椅有一个子类皮革座椅 public class Car { private Seat seat; ... @ManyToOne(fetch = FetchType.LAZY) public Seat getSeat() { return seat; } ... } @Entity @Inheritance(strategy=InheritanceType.JOINED) public class Seat {
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;
}
当我创建我的汽车,并使我的汽车座椅皮革座椅,它保存所有正确的数据库。当我想得到我的车(使用条件或查询列表)并阅读getSeat()时,座椅总是一个座椅,而不是皮制座椅。我不能施法(例外),似乎必须通过id手动获取LeatherSeat
这是使用联接继承类型的限制还是我遗漏了什么。如何获得LeatherSeat的席位?如果像使用getSeat一样进行懒散的获取,则只能获取父类,而不能获取子类。我使用FetchType.EAGER和getSeat尝试了相同的示例,并正确返回LeatherSeat 我不确定为什么hibernate在抓取时能得到一辆带皮座的汽车,但在偷懒抓取时hibernate似乎不能得到它。好像有什么东西坏了 InheritanceType.JOINED上有一个关于鉴别器列的票证,其中有一点是关于此场景的。但该票证被拒绝,这表明hibernate过于优雅,不需要InheritanceType.JOINED的鉴别器。但是,它无法正确返回延迟抓取的子类 然后,这张罚单更具体地针对这个问题,答案是“我们如何知道在一次延迟获取中得到哪个子类?”
两张票都是旧票,都被拒绝了。对我来说似乎是个问题。但现在,您必须更改为不同的继承类型,或者使用eager-fetch类型,因为这是由hibernate设计的 在惰性情况下,座椅将是一个“代理”,当汽车被实例化时,它被实例化。当时,Hibernate不知道座椅是否是真皮的 当您遍历该属性,并且该属性是惰性加载的时,Hibernate将知道座椅是皮革的,但它不能追溯更改代理的类。然而,所有的数据都在那里。如果您覆盖了任何方法,座椅将作为LeatherSeat响应 如果确实需要将此对象强制转换为LeatherSeat,则可以使用取消绑定代理) 请参阅本博客,了解为什么代理始终是Seat而不是LeatherSeat的更多信息: 下面的Hibernate文档简要介绍了这一点: