Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:默认构造函数必须为空吗?_Java_Jpa_Constructor_Eclipselink - Fatal编程技术网

Java JPA:默认构造函数必须为空吗?

Java JPA:默认构造函数必须为空吗?,java,jpa,constructor,eclipselink,Java,Jpa,Constructor,Eclipselink,使用JPA时,默认构造函数是否必须为空? 因为我不知道JPA内部是如何工作的,所以我担心当默认构造函数自己做一些事情时,比如用默认值填充属性等等,JPA会错误地初始化一个对象 谢谢。简短的回答是“否”。不要求为空 但是,您需要知道,当JPA实现从持久性具体化实例时,它将在无参数构造函数完成后对实例执行操作。这可能会撤消构造函数所做的操作 为了理解构造函数是否需要为空,您需要考虑在两个场景中调用构造函数。 当您创建一个“新”对象时,构造函数需要生成一个足够初始化以供普通代码使用的对象。应该处理需

使用JPA时,默认构造函数是否必须为空? 因为我不知道JPA内部是如何工作的,所以我担心当默认构造函数自己做一些事情时,比如用默认值填充属性等等,JPA会错误地初始化一个对象


谢谢。

简短的回答是“否”。不要求为空

但是,您需要知道,当JPA实现从持久性具体化实例时,它将在无参数构造函数完成后对实例执行操作。这可能会撤消构造函数所做的操作

为了理解构造函数是否需要为空,您需要考虑在两个场景中调用构造函数。

  • 当您创建一个“新”对象时,构造函数需要生成一个足够初始化以供普通代码使用的对象。应该处理需要初始化为非默认状态的字段

  • 当JPA从持久性存储中具体化一个对象时,具体化将“填充新构造实例的细节”。这通常会覆盖构造对象的对象状态


当然,您的代码可能被设计成不直接使用no-args构造函数。这使得第一个场景变得毫无意义,也使得可能出现的潜在浪费的“双重初始化”变得毫无意义。

较长的答案是:大多数情况下,它不应该是空的。例如,想象以下实体:

@Entity
public class Team {
    @Id
    private Long id;

    @OneToMany
    private Set<Player> players;

    // getters
}
@实体
公开课小组{
@身份证
私人长id;
@独身癖
私人场地球员;
//吸气剂
}
当JPA加载实例时,players集永远不会为空。它可以为空,但不能为null。但是,当您创建一个新团队,或者在单元测试中使用团队实例时,也应该确保这个不变量。所以这个类应该写成

@Entity
public class Team {
    @Id
    private Long id;

    @OneToMany
    private Set<Player> players = new HashSet<Player>(0);

    // getters
}
@实体
公开课小组{
@身份证
私人长id;
@独身癖
私有集播放器=新哈希集(0);
//吸气剂
}
这相当于

@Entity
public class Team {
    @Id
    private Long id;

    @OneToMany
    private Set<Player> players;

    public Team() {
        this.players = new HashSet<Player>(0);
    }
    // getters
}
@实体
公开课小组{
@身份证
私人长id;
@独身癖
私人场地球员;
公共团队(){
this.players=新哈希集(0);
}
//吸气剂
}

通过JPA最小化运行时开销,但在用户代码中创建新实例时强制执行约束:

  • 使用无/很少代码的受保护无参数构造函数,以促进最快路径的具体化,以及
  • 客户端代码的n-arg构造函数,包含根据约束实例化新对象所需的代码

在那里找到你的幸福:@Mik378-这并不能直接回答OP的具体问题。。。构造函数可以是非空的。并且,通过扩展,可以额外(浪费)时间来具体化实例。@RichardSitze-这是一个需要考虑的问题。但一般来说,不必要的初始化所花费的时间与具体化对象所花费的时间相比是微不足道的。“简短的回答是否定的。它不要求为空。”但具体说明如下:“实体类必须具有无参数构造函数。实体类也可以有其他构造函数。no-arg构造函数必须是公共的或受保护的。”所有这些都没有说明no-args构造函数必须有一个空的主体。这就是本问答的内容。