为什么GAE实体名称必须是唯一的,无论层次结构如何?

时间:2013-03-21 15:13:24

标签: java google-app-engine objectify

我使用Objectify在Google App Engine上。请考虑以下简化设置:

@Entity
public class UserGroup
{
    @Id
    private String identifier;
}

@Entity
public class User
{
    @Id
    private String username;
    private String password;
    @Parent
    Ref<UserGroup> usergroup;
}

现在我假设如果我有两个用户组(让我们称之为A和B),我最多可以有三个用户实体,用户名为“admin”:一个用户组A作为父组,一组用户组B作为父级,以及没有用户组作为父级的。

但事实并非如此。如果我在A组创建管理员,然后管理员没有组,那么管理员在B组中只有一个:B中的一个,它覆盖了另外两个。

对我来说,这似乎不一致。如果没有将B指定为父实体,并且只是将“admin”作为名称,我将无法找到B中的那个,因为这意味着在根中查找他。但是如果我在任何地方创建一个具有该名称的用户,它将覆盖具有相同名称的用户,而不管他在对象层次结构中的位置。

我的问题是:为什么?

2 个答案:

答案 0 :(得分:0)

你在测试中犯了一些错误。 {UserGroupA,“admin”}和{UserGroupB,“admin”}确实是具有单独密钥的独立实体。

答案 1 :(得分:0)

如果使用密钥名称作为ID创建“用户”实体,则数据存储区中只有一个唯一的“用户”具有该ID:如果您在数据存储区中写入两次具有相同密钥名称的用户,第一次写入将是“插入”,第二次将被视为“更新”。 在您的用例中,您可能应该为ID使用自动生成的Key对象,并使用另一个名为“role”的字段或其他字段来设置“admin”值。