[英]Google App Engine(Java) database auto-generated ID
在Google App Engine Java中,
當我做:
ProjectData pd = new ProjectData();
pd.id = null; // let Objectify auto-generate the project id
pd.dateCreated = date;
datastore.put(pd); // put the project in the db so that it gets assigned an id
運行“ datastore.put(pd)”時,數據庫將自動為每個pd分配一個唯一的ID。 但是,如果我添加父鍵字段:
ProjectData pd_new= new ProjectData();
pd_new.id = null; // let Objectify auto-generate the project id
pd_new.parentKey= new Key<OtherData>(OtherData.class, anotherId);
pd_new.dateCreated = date;
datastore.put(pd_new);
即使ID仍會自動生成,但它不再是唯一的。 id始終相同。 例如,我在數據庫中有7個ProjectData,它們的ID均為“ 5629499534213120”
我的數據結構是
public class ProjectData {
@Id Long id;
@Parent Key<OtherData> parentKey;
long dataCreated;
}
我在這里做錯什么了嗎,這困擾了我好幾天。
順便說一句,我可以通過手動分配它們來修復它
pd_new.id = System.currentTimeMillis();
但是我認為這不是合適的方法。
要為Andrei的答案添加更多細節:
在AppEngine中,有5個部分構成了一個Key,只有這5個部分共同保證了AppEngine中所有Key的唯一性:
因此,不同類型的實體可能具有相同的ID,此外,具有相同祖先路徑但具有不同祖先路徑的SAME類型的實體也可能具有相同的ID。 一個推論是,如果您有一個對象,但是更改了它的父對象,它將創建一個完整的NEW對象-它不會更新現有的對象。 因此,如果實體可以重新建立父關系,則永遠不要在AppEngine中將關系建模為父子關系。
因此,如果您使用的是Objectify,我建議的一件事是只公開從您的對象公開KEY(可能是網絡安全字符串版本),而不公開ID。 您擁有的另一個選項是使用字符串ID,但在保存之前用UUID.randomUUID填充它。
這是正確的行為。 為什么會打擾你?
為了從數據存儲區中get()
實體,您需要創建其鍵。 為此,您需要一個父鍵和一個子實體ID。 這樣,即使其他父實體的子實體具有相同的ID,該鍵也始終是唯一的(父實體始終具有不同的ID)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.