Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多态性';获取';使用hibernate,多对一,InheritanceType.JOINED_Hibernate_Inheritance_Polymorphism - Fatal编程技术网

多态性';获取';使用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文档简要介绍了这一点: