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

velaa5lx  于 2022-11-14  发布在  Java
关注(0)|答案(8)|浏览(239)

这听起来可能很愚蠢,但是为什么我需要在@Entity中定义一个空的构造函数呢?
我看到的每个教程都说:每个实体都需要一个空的构造函数。
但是Java总是给予你一个默认的不可见的空构造函数(如果你不重新定义的话)。
让我澄清一下..我对“需要”的理解是 * 写 *。
含义:始终在实体中编写空构造函数。
例如:

@Entity
public class MyEntity implements Serializable {

   @Id
   private String str;

   public MyEntity(){}

   //here getter and setter
}

但是Java总是在您不重新定义它(编写另一个带参数的构造函数)时给您这个空构造函数。
在这种情况下,编写这个空构造函数似乎毫无用处。

j2cgzkjk

j2cgzkjk1#

需要一个空的构造函数来通过持久性框架的反射创建一个新的示例。如果你没有为类提供任何带有参数的附加构造函数,你就不需要提供一个空的构造函数,因为默认情况下你会得到一个。
您还可以使用@PersistenceConstructor注解,如下所示

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

初始化你的实体。这样你也可以避免空的构造函数。

z9zf31ra

z9zf31ra2#

但是java总是给予你一个默认的不可见的空构造函数(如果你不重新定义的话)。
只有在类中没有提供任何构造函数时,此语句才成立。如果类中提供了参数构造函数,JVM将不会添加无参数构造函数。

vcirk6k6

vcirk6k63#

除非您为实体提供其他建构函式,否则不需要明确定义预设建构函式。如果您提供其他建构函式,除了具有预设建构函式签章的建构函式之外,将不会建立预设建构函式。
由于JPA实现依赖于默认构造函数的存在,因此必须包含将被省略的默认构造函数。

5w9g7ksd

5w9g7ksd4#

由于您指定了“JPA”标记,我假设您的问题仅适用于JPA,而不适用于一般的空构造函数。
持久性框架经常使用反射,更具体地说,使用Class<T>.newInstance()来示例化对象,然后通过内省调用getter/setter来设置字段。
这就是为什么你需要一个空的构造函数和getter/setter。
请参阅this StackOverflow question about empty constructors in Hibernate.

a11xaf1n

a11xaf1n5#

实际上不需要写,默认就有了,有时候可以创建private构造函数,防止用户使用default

public class MyClass{

private MyClass(){} 

}

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

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

jv4diomz

jv4diomz6#

所有答案都很好。
但是让我们来谈谈代码,下面的代码片段会给予你更清楚。

具有隐式构造函数的个人.java

public class PersonWithImplicitConstructor {
    
    private int id;
    
    private String name;

}

首先,我们必须编译.java文件
PersonWithImplicitConstructor.java
然后将生成类文件。
在这个类文件上运行javap将给予以下信息。
具有隐式构造器的javap人员. class

Compiled from "PersonWithImplicitConstructor.java"
public class PersonWithImplicitConstructor {
  public PersonWithImplicitConstructor();
}

**注意:**如果需要详细信息,可以在javap上使用-p标志.

下一个java文件将只具有参数化的构造函数。

具有显式构造函数的个人.java

public class PersonWithExplicitConstructor {
    
    private int id;
    
    private String name;

    public PersonWithExplicitConstructor(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

PersonWithExplicitConstructor.java
具有显式构造器的javap人员. class

Compiled from "PersonWithExplicitConstructor.java"
public class PersonWithExplicitConstructor {
  public PersonWithExplicitConstructor(int, java.lang.String);
}

具有两个构造函数的人员.java

public class PersonWithBothConstructors {

    private int id;
    
    private String name;

    public PersonWithBothConstructors() {

    }

    public PersonWithBothConstructors(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
}

PersonWithBothConstructors.java
具有两个构造器的javap人员. class

Compiled from "PersonWithBothConstructors.java"
public class PersonWithBothConstructors {
  public PersonWithBothConstructors();
  public PersonWithBothConstructors(int, java.lang.String);
}
nvbavucw

nvbavucw7#

Java并不总是给予你一个默认的不可见的空构造函数,如果你的类有参数构造函数,你必须自己定义空构造函数。

ecr0jaav

ecr0jaav8#

根据JPA标记,我假设您正在使用JavaBean。每个Bean都需要具有以下属性:
1.其所有主示例变量的getter和setter。
1.一个空的构造函数。
1.它的所有示例变量最好都是private
因此声明:“每个实体都需要一个空构造函数”。

相关问题