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
来实例化对象,然后通过内省调用getters / setter来设置字段。
这就是为什么你需要一个空的构造函数和getter / setter。
请参阅有关Hibernate中空构造函数的StackOverflow问题。
实际上你不需要写它。 你有默认的。 有时您可以创建private
构造函数以防止用户使用默认值
public class MyClass{ private MyClass(){} }
对于singelton模式,例如,您可以使用默认构造函数进行阻止。
有时候,当你使用Gson
插件将String Json数据转换为Object时,它需要编写默认构造函数,否则它不起作用
如果您的类有参数构造函数,Java并不总是为您提供默认的不可见空构造函数,您必须自己定义空构造函数。
从JPA标记,我想你正在使用Java bean。 每个bean都需要具有以下属性:
-
所有主要实例变量的getter和setter。
-
一个空的构造函数。
-
它的所有实例变量最好都是
private
。
因此声明:“每个实体都需要一个空的构造函数”。