Java实体 - 为什么我需要一个空的构造函数?

sli*_*pha 30 java entity jpa

这可能听起来很愚蠢,但为什么我需要在我的@Entitys中定义一个空构造函数?

我看到的每个教程都说:每个实体都需要一个空的构造函数.

但Java总是给你一个默认的不可见的空构造函数(如果你不重新定义一个).

谢谢.

编辑

我认为存在语义问题.我对"需要"所理解的是写作.

含义:始终在实体中编写一个空构造函数.

例:

@Entity
public class MyEntity implements Serializable {

   @Id
   private String str;

   public MyEntity(){}

   //here getter and setter
}
Run Code Online (Sandbox Code Playgroud)

但是当你不重新定义它时,Java总是给你这个空的构造函数(用参数写另一个).

在这种情况下,编写这个空构造函数似乎没用.

u6f*_*f6o 37

需要空构造函数来通过持久性框架的反射来创建新实例.如果您没有为该类提供任何其他带有参数的构造函数,则不需要提供空构造函数,因为每个默认值都会得到一个.

您还可以使用@PersistenceConstructor注释,如下所示

@PersistenceConstructor
public Movie(Long id) {
    this.id = id;
}
Run Code Online (Sandbox Code Playgroud)

如果项目中存在Spring Data,则初始化您的实体.因此,您也可以避免使用空构造函数.


Jun*_*san 27

但java总是给你一个默认的不可见的空构造函数(如果你不重新定义一个).

只有在类中未提供任何构造函数时,此语句才为真.如果在类中提供了参数构造函数,那么jvm将不会添加无参数构造函数.

  • 是的,我当时不知道。 (3认同)

Kev*_*sox 5

除非为实体提供另一个构造函数,否则不必显式定义默认构造函数.如果您提供另一个构造函数,除了具有默认构造函数签名的构造函数之外,将不会创建默认构造函数.

由于JPA实现依赖于默认构造函数的存在,因此必须包含将被省略的默认构造函数.


Arn*_*lle 5

当您指定“JPA”标签时,我假设您的问题仅适用于 JPA,而不适用于一般的空构造函数。

持久性框架通常使用反射,更具体地说,Class<T>.newInstance()用于实例化您的对象,然后通过自省调用 getter/setter 来设置字段。

这就是为什么您需要一个空的构造函数和 getter/setter 的原因。

请参阅有关 Hibernate 中的空构造函数的 StackOverflow 问题。