[英]Cannot load entity by root class in joined inheritance chain with JPA (Hibernate)
我有以下继承链:
@MappedSuperclass
public abstract class AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long id;
}
@Entity
@Table(name = "answers")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Answer extends AbstractEntity {
}
@Entity
@Table(name = "chosen_answers")
@PrimaryKeyJoinColumn
public class ChosenAnswer extends Answer {
@ManyToOne(optional = false)
@NotNull
AnswerChoice answerChoice;
}
@Entity
@Table(name = "free_text_answers")
@PrimaryKeyJoinColumn
public class FreeTextAnswer extends Answer {
String answerText;
}
我的数据库的(简化)样本内容如下所示:
答案:
- ID - -
| 100 |
free_text_answers:
--id ---- answer_text--
| 100 | “一些文字” |
从外键free_text_answers(id)
来answers(id)
创建。 问题是实体管理器为以下语句返回null
:
em.find(Answer.class, 100l); // returns null
尽管100是存储的答案的有效ID。 如果我在实体管理器中查询FreeTextAnswer
实例, FreeTextAnswer
得到预期的结果。
em.find(FreeTextAnswer.class, 100l) // returns stored entity
奇怪的是,当我查询实体管理器的子类型时,第一条语句也会返回所请求的实体。
这是预期的结果吗? 如果是,我如何设计继承链以自己喜欢的方式工作?
我使用Spring数据休息,我只揭露了Answer
通过RestRepository -entity,因此春季数据REST调用与实体管理器Answer
如预期的实体。
在对生成的SQL语句进行进一步调试之后,我找到了解决该问题的解决方法。
如下面的ER图所示, Answer
一个子类与另一个实体具有OneToOne
关系。 这种关系的默认fetchtype是EAGER
,原来是问题所在。 一旦将休眠配置为延迟加载此关系,一切都会按预期进行。
这是休眠状态的错误吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.