繁体   English   中英

无法使用JPA(Hibernate)在连接的继承链中按根类加载实体

[英]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 ,原来是问题所在。 一旦将休眠配置为延迟加载此关系,一切都会按预期进行。

这是休眠状态的错误吗?

ER图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM