这听起来可能很愚蠢,但是为什么我需要在@Entity
中定义一个空的构造函数呢?
我看到的每个教程都说:每个实体都需要一个空的构造函数。
但是Java总是给予你一个默认的不可见的空构造函数(如果你不重新定义的话)。
让我澄清一下..我对“需要”的理解是 * 写 *。
含义:始终在实体中编写空构造函数。
例如:
@Entity
public class MyEntity implements Serializable {
@Id
private String str;
public MyEntity(){}
//here getter and setter
}
但是Java总是在您不重新定义它(编写另一个带参数的构造函数)时给您这个空构造函数。
在这种情况下,编写这个空构造函数似乎毫无用处。
8条答案
按热度按时间j2cgzkjk1#
需要一个空的构造函数来通过持久性框架的反射创建一个新的示例。如果你没有为类提供任何带有参数的附加构造函数,你就不需要提供一个空的构造函数,因为默认情况下你会得到一个。
您还可以使用@PersistenceConstructor注解,如下所示
初始化你的实体。这样你也可以避免空的构造函数。
z9zf31ra2#
但是java总是给予你一个默认的不可见的空构造函数(如果你不重新定义的话)。
只有在类中没有提供任何构造函数时,此语句才成立。如果类中提供了参数构造函数,JVM将不会添加无参数构造函数。
vcirk6k63#
除非您为实体提供其他建构函式,否则不需要明确定义预设建构函式。如果您提供其他建构函式,除了具有预设建构函式签章的建构函式之外,将不会建立预设建构函式。
由于JPA实现依赖于默认构造函数的存在,因此必须包含将被省略的默认构造函数。
5w9g7ksd4#
由于您指定了“JPA”标记,我假设您的问题仅适用于JPA,而不适用于一般的空构造函数。
持久性框架经常使用反射,更具体地说,使用
Class<T>.newInstance()
来示例化对象,然后通过内省调用getter/setter来设置字段。这就是为什么你需要一个空的构造函数和getter/setter。
请参阅this StackOverflow question about empty constructors in Hibernate.
a11xaf1n5#
实际上不需要写,默认就有了,有时候可以创建
private
构造函数,防止用户使用default例如,对于singelton模式,您可以使用默认构造函数进行阻塞。
有时候,当你使用
Gson
插件将String Json数据转换为Object时,它要求写默认的构造函数,否则它不起作用jv4diomz6#
所有答案都很好。
但是让我们来谈谈代码,下面的代码片段会给予你更清楚。
具有隐式构造函数的个人.java
首先,我们必须编译
.java
文件PersonWithImplicitConstructor.java
然后将生成类文件。
在这个类文件上运行
javap
将给予以下信息。具有隐式构造器的javap人员. class
**注意:**如果需要详细信息,可以在
javap
上使用-p
标志.下一个java文件将只具有参数化的构造函数。
具有显式构造函数的个人.java
PersonWithExplicitConstructor.java
具有显式构造器的javap人员. class
具有两个构造函数的人员.java
PersonWithBothConstructors.java
具有两个构造器的javap人员. class
nvbavucw7#
Java并不总是给予你一个默认的不可见的空构造函数,如果你的类有参数构造函数,你必须自己定义空构造函数。
ecr0jaav8#
根据JPA标记,我假设您正在使用JavaBean。每个Bean都需要具有以下属性:
1.其所有主示例变量的getter和setter。
1.一个空的构造函数。
1.它的所有示例变量最好都是
private
。因此声明:“每个实体都需要一个空构造函数”。