gpt4 book ai didi

java - 无法通过 JPA (Hibernate) 连接的继承链中的根类加载实体

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:32 25 4
gpt4 key购买 nike

我有以下继承链:

@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 | 100 “一些文字”|

创建从 free_text_answers(id)answers(id) 的外键。问题是实体管理器针对以下语句返回 null:

em.find(Answer.class, 100l); // returns null

尽管如此,100 是存储答案的有效 ID。如果我向实体管理器查询 FreeTextAnswer 的实例,我会得到预期的结果。

em.find(FreeTextAnswer.class, 100l) // returns stored entity

奇怪的是,一旦我查询实体管理器的子类型,第一个语句也返回所请求的实体。

这是预期的结果吗?如果是,我如何设计我的继承链以我喜欢的方式工作?

我正在使用 Spring Data Rest,并且仅通过 RestRepository 公开 Answer 实体,因此 Spring Data Rest 使用 Answer 作为预期实体来调用实体管理器。

最佳答案

对生成的 SQL 语句进行进一步调试后,我找到了解决该问题的解决方法。

正如您在下面的 ER 图中所看到的,Answer 的一个子类与另一个实体具有 OneToOne 关系。这种关系的默认 fetchtype 是 EAGER,这被证明是问题所在。一旦我将 hibernate 配置为延迟加载此关系,一切都会按预期进行。

这是 hibernate 中的错误吗?

ER Diagram

关于java - 无法通过 JPA (Hibernate) 连接的继承链中的根类加载实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com