【问题标题】:App Engine: How to persist related entities using ObjectifyApp Engine:如何使用 Objectify 持久化相关实体
【发布时间】:2015-04-17 02:21:30
【问题描述】:

给定以下配置

@Entity
public class A{
  …
  private List<Key<B>>bees;
  …
}

@Entity
public class B{
  …
}

我如何坚持 B 使其属于 A 中 bees 的集合?我必须坚持两次吗?当我使用 JPA/JDO 和 Datanucleus 时,我所做的只是

A aa = getA();
B bb = createB(…);
aa.getBees().add(bb);
aa.update();

但是使用 Objectify 我必须坚持两次吗?如题,我必须这样做吗

A aa = getA();
B bb = createB(…);

aa.getBees().add(bb.getKey());
ofy().save().entity(bb).now();
ofy().save().entity(aa).now();

【问题讨论】:

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


    【解决方案1】:

    我不清楚你在问什么,但是在持久化相关实体时,#1 最佳实践是使用分配器显式分配 id。事实上,你最好不要使用“null Long ids are set on save”功能。

    因此,保存一个 A 和一个 B:

    B b = new B(...);    // Id set by ObjectifyFactory.allocateId()
    A a = new A(...);    // Id set by ObjectifyFactory.allocateId()
    a.getBees().add(b.getKey());
    ofy().save().entities(a, b);
    

    我个人会将b 添加到A 的构造函数中。

    【讨论】:

    • 我手动将我的密钥创建为pageKey=KeyFactory.createKey(bookKey, Page.class.getSimpleName(), bookId+""+pageNumber) 所以实际上我已经有了密钥。所以我想这与使用ObjectifyFactory.allocateId() 相同。我实际上使用的是Key,而不是 Long 或 String
    • 以下行也未编译 a.getBees().add(b.getKey()); 我无法将数据存储键添加到对象化泛型。你知道如何解决这个问题吗?标记@tx802
    • 您可以在本机数据存储 Key 和 Objectify 的 Key&lt;?&gt; 之间轻松进行转换。这是一个 Java 101 问题,Objectify 的 Javadocs 很容易回答。
    【解决方案2】:

    是的,您需要同时输入 aabb(根据您的示例)。请记住,Bs 列表中的 A 并没有什么特别之处——它就像任何其他多值属性一样,但这些值是 Keys 而不是 Longs 或 Strings。

    因此,当您保留 aa 时,Objectify 不会“遵循”这些键并保留引用的实体。我会遵从 stickfigure 但我认为这是设计使然,因为它可能会引入一些意外写入,这可能会影响您的应用程序的成本和性能。

    【讨论】:

    • 我手动将我的密钥创建为pageKey=KeyFactory.createKey(bookKey, Page.class.getSimpleName(), bookId+""+pageNumber) 所以实际上我已经有了密钥。所以我想这与使用ObjectifyFactory.allocateId() 相同。我实际上使用的是Key,而不是 Long 或 String
    • 此外,以下行未编译 a.getBees().add(b.getKey()); 我无法将数据存储键添加到对象化泛型。你知道如何解决这个问题吗?
    • 我不知道b.getKey() 是什么,但您应该可以将Key.create(b) 添加到您的List
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多