【问题标题】:Google App Engine(Java) database auto-generated IDGoogle App Engine(Java) 数据库自动生成的 ID
【发布时间】:2014-06-29 06:02:31
【问题描述】:

在 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();

但我认为这不是一个合适的方法。

【问题讨论】:

    标签: java database google-app-engine google-cloud-datastore


    【解决方案1】:

    为安德烈的回答添加更多细节:

    在 AppEngine 中,一个 Key 由 5 个部分组成,只有这 5 个部分 TOGETHER 才能保证 AppEngine 中所有 Key 的唯一性:

    1. 您的应用的 ID。
    2. 命名空间,用于多租户应用程序。
    3. 实体类型名称。
    4. 完整的祖先路径。
    5. 此实体的 ID。

    因此,不同类型的实体可能具有相同的 ID,此外,具有相同类型但具有不同祖先路径的实体可能具有相同的 ID。一个推论是,如果你有一个对象,但改变了它的父对象,它会创建一个全新的对象——它不会更新现有的对象。因此,如果实体可能被重新设置为父级,则永远不应在 AppEngine 中将关系建模为父子级。

    因此,如果您使用 Objectify,我建议您只公开您的对象中的 KEY(可能是网络安全的字符串版本),而不是 ID。您拥有的另一个选项是使用字符串 ID,但在保存之前使用 UUID.randomUUID 填充它。

    【讨论】:

    • 命名空间也是键的一部分。
    • 感谢@PeterKnego,忘记了多租户应用程序。编辑了我的答案以添加命名空间。
    【解决方案2】:

    这是正确的行为。为什么会困扰你?

    为了get()来自数据存储区的实体,您需要创建其密钥。为此,您需要一个父键和一个子实体 ID。这使得该键始终唯一(父实体始终具有不同的 ID),即使其他父实体的子实体具有相同的 ID。

    【讨论】:

    • 所以你的意思不是让它自动生成,而是手动使用 (parent, child) 作为键,对吧?它仍然是一个长的int id吗?谢谢
    • 不,您应该使用自动生成的 ID。当您想要检索子实体的密钥时,您需要知道它,或者如果您知道子实体的 id 及其父实体的 id,则可以随时创建此密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多