App Engine:如何使用Objectify持久保存相关实体

时间:2015-04-17 02:21:30

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

给出以下配置

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

2 个答案:

答案 0 :(得分:2)

我不清楚你在问什么,但是持久化相关实体的最佳做法是使用分配器显式分配id。事实上,你最好永远不要使用“保存时设置null Long ID”。

因此,要保存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的构造函数中。

答案 1 :(得分:0)

是的,您需要同时放置aabb(根据您的示例)。请记住,B中的A列表没有什么特别之处 - 它就像任何其他多值属性一样,但这些值是Key而不是Long s或String s。

因此,当你坚持aa时,Objectify就不会“跟随”这些键并坚持引用的实体。我会推迟 stickfigure ,但我想这是设计的,因为它可能会引入一些意外的写入,这可能会影响应用程序的成本和性能。