我有一个简单的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
}
Run Code Online (Sandbox Code Playgroud)
在此类对象的生命周期中的某个时刻,JPA必须调用setId()
以记录生成的ID值.我的问题是,这是什么时候发生的,以及说明这一点的文档在哪里.我查看了JPA规范,但找不到明确的声明.
JPA规范说(重点补充):
托管实体实例是具有持久标识的实例,该标识当前与持久性上下文相关联.
这是否试图说必须管理对象具有@Id
重要意义?说明EntityManager.persist()
(强调添加)的文档使"实例管理和持久",这是否意味着@Id
由该方法设置?或者直到你打电话EntityTransaction.commit()
?
当@Id
设置可能是不同的JPA提供商不同,也许不同的生成策略.但是,最安全(可移植,符合规范)的假设是什么,你可以在生命周期的最早点设置它?
通常,玩!请求成功完成后提交事务.在Play中手动提交事务的正确方法是什么?
void addPerson() {
Person p = new Person("John", "Doe");
p.save();
// TODO - commit the transaction
// Now p should have an ID
assert p.id != null;
usePersonIdForSomethingNasty(p.id);
}
Run Code Online (Sandbox Code Playgroud)