使用JPA时,默认的构造函数是否为空? 由于我不清楚JPA内部是如何工作的,所以我担心JPA会错误地初始化一个对象,当默认的构造函数自己做一些事情时就像用默认值等填充属性一样。
感谢。
答案 0 :(得分:9)
通过JPA最小化运行时开销,但在用户代码中创建新实例时强制执行约束:
答案 1 :(得分:6)
简短的回答是否定的。它不需要是空的。
但是,您需要注意,当JPA实现从持久性实现实例时,它将在no-args构造函数完成后对实例执行操作。这可能会撤消构造函数所做的事情。
要了解构造函数是否需要为空,您需要考虑在两种情况下调用构造函数。
在创建“新”对象时,构造函数需要生成一个足够初始化的对象,以供普通代码使用。应该处理需要初始化为非默认状态的字段。
当JPA从持久性存储中实现对象时,实现将继续“填充新构造的实例的细节”。这通常会覆盖构造对象的对象状态。
当然,您的代码可能被设计为不直接使用no-args构造函数。这使得第一个场景没有实际意义,并且还会造成可能发生的潜在浪费的“双重初始化”。
答案 2 :(得分:4)
答案越长:大部分时间都不应该是空的。例如,想象以下实体:
@Entity
public class Team {
@Id
private Long id;
@OneToMany
private Set<Player> players;
// getters
}
当JPA加载实例时,播放器集将永远不会为空。它可能是空的,但不是null。但是当您创建新团队时,或者在单元测试中使用Team实例时,也应确保此不变量。所以这个课应该写成
@Entity
public class Team {
@Id
private Long id;
@OneToMany
private Set<Player> players = new HashSet<Player>(0);
// getters
}
相当于
@Entity
public class Team {
@Id
private Long id;
@OneToMany
private Set<Player> players;
public Team() {
this.players = new HashSet<Player>(0);
}
// getters
}