【问题标题】:Can I persist child objects in @PrePersist handler of a parent class? (Objectify 3.1b1)我可以在父类的 @PrePersist 处理程序中保留子对象吗? (客观化 3.1b1)
【发布时间】:2011-10-20 02:18:41
【问题描述】:

我是 Objectify 的新手,正在尝试实现一对多关系。我有实体 Organization 和实体 Person。组织有@Transient 属性ListcontactPeople。类 Person 有 @Parent 属性 Key organizationKey 我可以通过 setter 设置。

我想在组织的@PrePersist 处理程序中坚持contactPeople。为此,我需要在 Person 中设置父键。

Wiki here 说:“您不能在 @PrePersist 回调中更新 @Id 或 @Parent 字段;此时,低级实体已经使用完整的 Key 构造,因此它可以作为可选参数传入。”

我不确定这仍然是准确的信息吗?因为我在PrePersist 处理程序中获得的com.google.appengine.api.datastore.Entity 对象的键具有字面意思是“no-id-yet”的键。

你会如何实现这个?

谢谢!

2011 年 11 月 17 日更新:

在新的 Objectify4 中,我们将能够像这样进行半自动关系:

class Beastie {
   @Parent
   @Load
   ParentThing parent;

   @Id Long id;

   @Load({"bigGroup", "smallGroup"})
   SomeThing some;

   @Load("bigGroup")
   List<OtherThing> others;

   @Load
   Ref<OtherThing> refToOtherThing;

   Ref<OtherThing> anotherRef;  // this one is never fetched automatically
}

Here正在改进新版本的设计文档。

这是个大新闻。 Twig 作者 John Patterson 今天加入了 Objectify 项目。

【问题讨论】:

  • 出于好奇,我这样做了:@PrePersist void onPersist(Objectify ofy) { if (id == null) id = ofy.getFactory().allocateId(getClass()); }。事实证明,这个分配的 ID 被我分配的数字所覆盖,这使我得出这样的结论,即 Wiki 已过时并且 Key 是在 PrePersist 事件之后构建的。伤心。
  • Objectify 的作者 Jeff Schnitzer 回答了我的问题。 “我通常认为将持久性操作放在实体 pojo 中是一个坏主意。这就是原因之一。这些信息是准确的。你不能按照你的建议去做。我想不出一个临时的解决方法。杰夫"

标签: java google-app-engine persistence entity-relationship objectify


【解决方案1】:

嗯,看来你需要在你的数据模型前面做一道道。因此,您将能够执行以下操作:

Organization organization = ...
List<Person> people = ...
ob.put(organization)
for (Person person: people) {
    person.organizationKey = organization.getKey();
    ob.put(person);
    organization.contactPeopleKeys.add(person.getKey());
}
ob.put(organization)

GAE+Objectify 需要自己的代码来处理很多事情,所以很常见

【讨论】:

  • 根据Objectify的作者情况在Objectify4中会更好。我用信息更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2018-04-30
相关资源
最近更新 更多