【问题标题】:Google app engine generated ids unique for different entitiesGoogle 应用引擎为不同的实体生成唯一的 ID
【发布时间】:2013-10-28 12:31:37
【问题描述】:

我的 Google App Engine 数据存储中有两个实体使用 Java,Objectify 4,我有一个要求,这两个实体的自动生成的 id 应该是唯一的,也就是说,来自第一个实体的 id 永远不会有条目用于第二个实体。

如何确保生成的 ID 不会针对不同的实体重复。 ?

在 JPA 中,如果我对 id 使用生成值策略 AUTO,则在数据库级别,维护唯一值,GAE 是否也遵循相同?我目前正在使用 Objectify4 进行持久化。

JPA 参考:AUTO strategy

【问题讨论】:

    标签: java google-app-engine objectify


    【解决方案1】:

    如果您的实体属于同一 kind(= JPA 中的同一类),则保证 auto-generated IDs 是唯一的。

    更新:OP 澄清说他需要跨不同实体类型的唯一 ID。

    您将需要使用手动生成的 ID - 使用 allocateIds(kind, num) 方法,其中您使用虚构的 kind。使用num of 1 只生成一个ID。

    long uniqueId = DatastoreService.allocateIds("MyUniqueUserKind", 1).getStart().getId();
    

    只要您始终使用相同的kind,以这种方式生成的所有 ID 始终是唯一的,在本例中为 "MyUniqueUserKind"

    【讨论】:

    • 感谢彼得的重播,我在发布之前阅读了该文档,看看我的场景:我有两个不同的类,根据设计说一个类“Users”和另一个“DummyUsers”,这两个类都应该存在并且它们不应该共享相同的ID。因为有时我使用 ID 来识别对象的类型。我使用了策略 AUTO 的 Generated Value,这能满足我的需要吗?
    • 不,每种类型(“Users”和“DummyUsers”)都有自己独特的生成器,但不能保证它们不会发生冲突。用解决方案更新了答案。
    • 谢谢彼得,我接受了这个答案,你能告诉我我们是否可以像 JPA 那样在 gae 中使用序列生成器吗?
    • 我不知道 JPA 我不能说。我的猜测是 JPA 自动生成器在底层使用 GAE 自动生成器。这是个坏消息,因为默认情况下这意味着他们使用每个类的自动生成器,这不会像预期的那样对您起作用(= 一个生成器用于多个不同的类)。
    • 谢谢彼得。你的回答真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2016-12-05
    • 2013-02-09
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多