Objectify:我如何在多种类型中拥有唯一的ID?

时间:2017-02-18 11:37:11

标签: java google-app-engine objectify

我有一些类型具有公共字段(电子邮件ID),我将其用作@Id。这些类型从具有电子邮件ID字段的普通类型用户扩展。它如下所示:

@Entity
class User{
  @Id
  String emailID;
}

@Entity
@Subclass(index = true)
class UserType1 extends User{

  String otherField;
}


@Entity
@Subclass(index = true)
class UserType2 extends User{

  String otherField;
}

现在,我希望每次插入User的子类型时,电子邮件ID应该在数据存储区中的所有这些子类型对象中保持唯一。我通过插入具有相同EmailID的每个子类型来测试上述类型的端点,并且它成功发生 - Objectify不应该允许具有相同ID的子类型的持久性。根据我的理解,密钥可以确保最终的唯一性,但是我不能确保Id只在子类型中的唯一性,特别是当ID在基类中时?有办法吗?

修改 虽然,这不是我想要的解决方案,但我通过创建一个新的实体类型来处理这种情况,其中{EmailID,Key_Subtype}用于确保唯一性。我只是检查这个实体是否有现有的emailID,我使用密钥来检索另一个查询对象。

如果有人找到更好的解决方案,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

UUID就是你要找的东西。它是为每个实体生成的。类型并不重要。

https://dzone.com/articles/hibernate-and-uuid-identifiers

答案 1 :(得分:0)

对于不同的实体类型,相同的Id绝对可以在数据存储级别进行,请参阅re-using an entity's ID for other entities of different kinds - sane idea?

Id唯一性仅在相同类型且具有相同父实体的实体中得到保证(唯一实体键基于这3个项目的组合)。由于您的子类型实际上是不同的实体类型,因此在这些类型中具有相同的Id没有问题,因此子类化不是实现您想要的方式。

要拥有唯一的Id,您需要拥有唯一的实体类型,例如User。区分不同的用户类型可能有Usertype属性,该属性是对包含特定于该用户类型的信息的UserTypeX类实体的引用?

答案 2 :(得分:0)

听起来你已经发现"正确"解决方案 - 创建一个Email实体,该实体使用电子邮件地址作为id,并包含指向相应User实体的指针。创建新的User / Email时,请务必检查交易中是否存在电子邮件地址。

除了额外的间接层允许用户更改其电子邮件地址外,这与使用电子邮件地址直接作为User的ID完全不同,这通常是一个好主意。事务逻辑在任何一种方式都类似。

交易查询&创建具有自然主键的实体几乎是保证数据存储区唯一性的唯一方法。它有效且可扩展。