【问题标题】:As per JPA spec, default constructor is must in entity classes, why?根据 JPA 规范,实体类中必须有默认构造函数,为什么?
【发布时间】:2015-08-28 12:19:14
【问题描述】:

我有一个问题,正如我上面提到的,我知道根据 JPA 规范和 Hibernate 文档,默认构造函数是必须并且应该具有包级别的访问权限。我想知道,如果没有公共构造函数,它的代码仍然可以工作。为什么?

我也进入了Class.java的代码,发现如下一行

// No cached value available; request value from VM

这是否意味着它向 VM 请求构造函数?即默认构造函数。这是否意味着我的代码(没有默认构造函数)依赖于 VM?字节码增强呢?

我的重构问题:

我想知道为什么 JPA 添加了这个“必须”要求来定义实体的默认构造函数。

按照规范:

The entity class must have a no-arg constructor. The entity class may have other constructors as well.
The no-arg constructor must be public or protected.

为什么会这样?我知道 Java 确实引入了一个默认构造函数,如果没有定义,那为什么要把它放在规范中呢?

希望这次我的问题是正确的。

再次感谢... :)

【问题讨论】:

  • 为什么不从发布您的课程开始呢?如果您没有构造函数,那么编译器会免费为您提供一个。其他 JPA 实现可以使用字节码增强添加默认 ctr,因此您也不需要在那里定义一个。
  • 我知道这一点,请阅读我的问题,您只回答了我已经知道的一件事。我想知道的是在 JPA 规范中强制执行它的目的是什么?为什么规范必须定义这个。
  • 对于不受欢迎的选民,请这个网站不仅适用于那些拥有成千上万名声的人,我对此很好奇我尝试了“谷歌搜索”但找不到任何令人满意的答案,那就是为什么在这里发帖。如果你不能回答并不意味着问题很糟糕或幼稚
  • 除非你发布类(或者更好的是你编译的类的反编译形式,我们看不到它实际上有什么,在编译/增强过程中是否添加了默认构造函数)人无法进一步评论(我们不知道您已经知道什么)。对任何对您的问题投反对票的人咆哮无济于事,最好还是专注于在其他人要求的地方提供更多信息。为什么它在 JPA 规范中?问写它的人,但我希望它是实例化一个对象,这是一种可靠的方式,不会施加太多
  • 对于大多数读者来说,如果您评论并参考您所指的 JPA 规范部分,将会很有帮助。至少给出您要求我们评论的规范版本的确切 URL。

标签: java hibernate jpa specifications


【解决方案1】:

在 Java 中,如果你根本没有定义构造函数,你会得到一个默认构造函数,它是公共的和零参数,即它符合 JPA 规范的要求。

但如果你定义了任何其他构造函数,默认构造函数不会自动添加,因此该类不符合 JPA 要求。您必须在您想要的任何其他构造函数旁边显式添加零参数构造函数。

至于为什么 JPA 规范需要它:它需要一个零参数构造函数,因为它不知道将什么值传递给其他构造函数中的参数。

nb:你提到的关于Class.java 的东西完全不相关

【讨论】:

  • 您好,我已经更新了我的问题,请再次查看。
  • The entity class must have a no-arg constructor. 如果您根本没有定义构造函数(因为隐含了无参数构造函数),也满足此条件。也许这就是您的困惑所在,规范并没有说您必须在代码中明确定义它。它必须“拥有”它,可能是暗示的。
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多