簡體   English   中英

Google App Engine(Java)數據庫自動生成的ID

[英]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的唯一性:

  1. 您的應用程序的ID。
  2. 在多租戶應用程序中使用的名稱空間。
  3. 實體類型名稱。
  4. 完整的祖先路徑。
  5. 該實體的ID。

因此,不同類型的實體可能具有相同的ID,此外,具有相同祖先路徑但具有不同祖先路徑的SAME類型的實體也可能具有相同的ID。 一個推論是,如果您有一個對象,但是更改了它的父對象,它將創建一個完整的NEW對象-它不會更新現有的對象。 因此,如果實體可以重新建立父關系,則永遠不要在AppEngine中將關系建模為父子關系。

因此,如果您使用的是Objectify,我建議的一件事是只公開從您的對象公開KEY(可能是網絡安全字符串版本),而不公開ID。 您擁有的另一個選項是使用字符串ID,但在保存之前用UUID.randomUUID填充它。

這是正確的行為。 為什么會打擾你?

為了從數據存儲區中get()實體,您需要創建其鍵。 為此,您需要一個父鍵和一個子實體ID。 這樣,即使其他父實體的子實體具有相同的ID,該鍵也始終是唯一的(父實體始終具有不同的ID)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM