2

第一件事:

  1. 我知道这个问题,在高度抽象的情况下,我在这里问的问题是一样的;但是,我发现它(及其答案)缺乏,因此,我想在这里详细说明这个主题;
  2. 我会请任何对 JPA 和 Hibernate 中的正式定义有很好理解的人来帮助我澄清这个混乱。

免责声明:我不是在寻找有关实体是什么以及如何使用它的基本解释。我使用 Hibernate/JPA 已经有一段时间了。

我的问题更多是关于正式定义,以澄清EntityPersistent Class之间的正式语义(定义)的区别,以明确一个与另一个之间的区别以及它们是如何定义的。

最初,我希望在JSR 338:JPA 规范 2.2Hibernate 5.0.0 参考文档中找到答案,但我很困惑,因为我有一种感觉,在这种情况下,两个文档都缺少,离开这些概念/定义重叠并引入一些推测的空间很大。


让我们从 JSR 338:JPA 2.2 规范开始:

由于某些(对我来说很奇怪)的原因,在整个规范中,没有找到关键字短语“Persistent Object”和“Persistent Class”,也就是说,它们分别只找到一次和两次:

  • 持久对象- 在 Javadoc 注释中找到,没有什么有趣的说法(第 221 页)
  • 持久类- 再次在 xsd 文档中找到,没什么好说的(第 378、529 页)

不幸的是,这就是本规范中的内容,仅此而已。

另一方面,实体类定义如下

实体是轻量级的持久域对象。主要的编程工件是实体类。一个实体类可以使用辅助类作为辅助类或用来表示实体的状态。

再一次,我发现正式规范文档极其缺乏,但至少,这表明它是一个持久的域对象

在同一个文档中,实体也被定义为一个类(2.1 实体类,第 23 页)。

尽管这看起来可能并不重要,但将其定义为Persistent Object还是Class是相当令人困惑的。

我基于此规范文档的结论:

  1. JPA 2.2 规范中根本没有定义持久类/对象;
  2. Entity被定义为持久对象并且(!),作为一个Class,这对我来说真的不清楚;

在我的概念理解中,Persistent Object听起来很像一个对象,如果(!)它将被相应地映射,它是可持久的; 因此,Persistent Class - 作为一个Class,如果相应地映射类,则可以将其实例持久化(即,通过符合 POJO 概念,它们可以存储到数据库层中)。即Persistent Class是一个可持久的类,如果它有对应的映射定义(使用 .hbm.xml 或 JPA 注释),它会转换为Entity 。


Hibernate 5 参考文档

另一方面,Hibernate定义了 Persistent Classes,它这样做如下:

持久类是应用程序中实现业务问题实体的类(例如,电子商务应用程序中的客户和订单)。这里的术语“持久化”是指类能够被持久化,而不是它们处于持久化状态。

我说的对吗,Persistent Classes 实现了实体的意思,我的上层理解是正确的,Persistent Class只是一个 Java 类,它实现了Entity模型(没有映射),并结合它的映射(.hbm. xml 或 JPA)它成为一个实体持久类 + 映射定义 = 实体是否正确?


我还会在此处插入Java Persistence with Hibernate, Second Edition书中的一些片段:

您编写了一个持久类及其带有注释的映射。- (总结 2.4);

有点,将持久类与其映射区分开来,并且再次支持这样的想法,即持久类及其映射是不同的概念,从逻辑上讲,仅持久类本身就不是实体。

持久性类不知道并且不依赖于持久性机制。- (第 3.2 章);

明确指出,持久类不知道持久性机制。

例如,您可以在持久性上下文之外,在单元测试或表示层中重用持久性类。您可以使用常规 Java new 运算符在任何运行时环境中创建实例,从而保持可测试性和可重用性。-(第 3.2 章)。

也支持这样的想法,即持久类不一定是映射实体。

我的结论:(
基于我最初的理解,这似乎得到了《Hibernate Reference Documentation》和《Java Persistence with Hibernate, Second Edition》一书的支持。)

持久类是 Java 类,它(如果需要!)将符合 JPA 规范(根据该规范,它们需要是 POJO 并且可以映射),但如果它们没有映射它们就不是实体,它们可以可以在 JPA 之外的上下文中使用,就像在普通 Java 对象上一样对它们进行操作,甚至在表示层上呈现它们。


最后:

如您所见,我的问题有点混合了不同的资源,显示出我明显的困惑,因为我无法清楚地定义正式的,即这两个概念的所谓科学采用的定义。

我们能否清楚地定义什么是Persistent Class,什么是Entity,以及它们在 JPA 和 Hibernate 方面的语义明确差异/重叠是什么?

4

0 回答 0