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

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

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

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

谢谢。

编辑

我认为存在语义问题。 我对“需要”所理解的是写作。

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

例:

 @Entity public class MyEntity implements Serializable { @Id private String str; public MyEntity(){} //here getter and setter } 

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

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

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

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

 @PersistenceConstructor public Movie(Long id) { this.id = id; } 

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

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

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

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

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

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

Persitence框架通常使用reflection,更具体地说是Class.newInstance()来实例化对象,然后通过内省调用getters / setter来设置字段。

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

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

实际上你不需要写它。 你有默认的。 有时您可以创建private构造函数以防止用户使用默认值

 public class MyClass{ private MyClass(){} } 

对于singelton模式,例如,您可以使用默认构造函数进行阻止。

有时候,当你使用Gson插件将String Json数据转换为Object时,它需要编写默认构造函数,否则它不起作用

如果您的类有参数构造函数,Java并不总是为您提供默认的不可见空构造函数,您必须自己定义空构造函数。

从JPA标记,我想你正在使用Java bean。 每个bean都需要具有以下属性:

  1. 所有主要实例变量的getter和setter。

  2. 一个空的构造函数。

  3. 它的所有实例变量最好都是private

因此声明:“每个实体都需要一个空的构造函数”。