根据JPA规范,默认构造函数必须在实体类中,为什么?

时间:2015-08-28 12:19:14

标签: java hibernate jpa specifications

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

我也进入了Class.java的代码我找到了一行如下

// No cached value available; request value from VM

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

我的重构问题:

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

根据规范:

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确实引入了一个默认的构造函数,如果没有定义,那么为什么要将它放在spec中?

我希望这次我正确地提出了我的问题。

再次感谢... :)

1 个答案:

答案 0 :(得分:0)

在Java中,如果你根本没有定义构造函数,你将得到一个默认构造函数,它是public和zero-args,即它符合JPA规范的要求。

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

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

nb:你提到的关于Class.java的内容完全不相关