这可能听起来很愚蠢,但为什么我需要在我的@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将不会添加无参数构造函数.
除非为实体提供另一个构造函数,否则不必显式定义默认构造函数.如果您提供另一个构造函数,除了具有默认构造函数签名的构造函数之外,将不会创建默认构造函数.
由于JPA实现依赖于默认构造函数的存在,因此必须包含将被省略的默认构造函数.
当您指定“JPA”标签时,我假设您的问题仅适用于 JPA,而不适用于一般的空构造函数。
持久性框架通常使用反射,更具体地说,Class<T>.newInstance()用于实例化您的对象,然后通过自省调用 getter/setter 来设置字段。
这就是为什么您需要一个空的构造函数和 getter/setter 的原因。
请参阅有关 Hibernate 中的空构造函数的 StackOverflow 问题。
| 归档时间: |
|
| 查看次数: |
56307 次 |
| 最近记录: |