我有一個使用一個生成long
「ID」作爲其主鍵的簡單JPA實體:在對象的生命週期什麼時候JPA設置@GeneratedValue @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提供商不同,也許不同的生成策略。但是,對於設定的生命週期中的最早點,您可以做出哪些最安全的(可移植的,符合規範的)假設?
聽起來像你可以很容易地建立調試的東西。 – skaffman 2012-01-31 22:41:01
我敢打賭,如果規範沒有明確地說*應該生成@Id,那麼它就要由供應商決定。 – 2012-01-31 22:43:48
@Rededwald:調試將告訴你JPA如何在內部工作,並告訴你哪些位是特定於方言的。 – skaffman 2012-01-31 22:48:29