【发布时间】:2012-02-23 15:53:53
【问题描述】:
我有一个简单的 JPA 实体,它使用生成的 long“ID”作为其主键:
@Entity
public class Player {
private long id;
protected Player() {
// Do nothing; id defaults to 0L
}
@GeneratedValue
@Id
public long getId() {
return id;
}
protected void setId(final long id) {
this.id = id;
}
// Other code
}
在这种类型的对象生命周期的某个时刻,JPA 必须调用setId() 来记录生成的 ID 值。我的问题是,什么时候会发生这种情况,说明这一点的文档在哪里。我查看了 JPA 规范,但找不到明确的声明。
JPA 规范说(强调):
托管实体实例是具有持久性身份的实例,当前与持久性上下文相关联。
这是否是说对象必须管理才能使其@Id 显着?
EntityManager.persist() 的文档说(强调)它使“实例托管和持久化”,这是否意味着@Id 是由该方法设置的?或者直到你打电话给EntityTransaction.commit()?
@Id 的设置可能因不同的 JPA 提供程序而异,也可能因生成策略不同而异。但是,对于已设置的生命周期中的最早点,您可以做出的最安全(便携、符合规范)的假设是什么?
【问题讨论】:
-
听起来你可以通过调试轻松建立。
-
我敢打赌,如果规范没有明确说明 何时,则应该生成 @Id,而不是由供应商决定。
-
@Raedwald:调试会告诉你 JPA 在内部是如何工作的,并告诉你哪些位是特定于方言的。
-
相关但不重复的问题:stackoverflow.com/questions/8169640/…
标签: java jpa primary-key