【问题标题】:What is appropriate way of creating objects with One-to-Many relationship using Objectify and RequestFactory?使用 Objectify 和 RequestFactory 创建具有一对多关系的对象的适当方法是什么?
【发布时间】:2011-12-10 13:08:29
【问题描述】:

使用 Objectify 和 RequestFactory 创建具有一对多关系的对象的适当方法是什么?我已经阅读了这些库的文档,还查看了一些示例项目,例如 listwidgetgwtgae2011。他们都使用@Embedded 注释,这不是我想要的,因为它将所有内容都存储在一个实体中。根据文档的另一个选择是在子类中使用 @Parent 属性。在我的示例中(为简单起见,删除了 getters/setters)我有实体 PersonOrganization 定义为

@Entity
public class Person extends DatastoreObject
{
    private String name;
    private String phoneNumber;
    private String email;
    @Parent private Key<Organization> organizationKey;
}

@Entity
public class Organization extends DatastoreObject
{
    private String name;
    private List<Person> contactPeople;
    private String address;
}

现在,如果我正确理解了文档以便将组织与一个人持久化,我必须先持久化组织,然后为 Person 对象设置 organizationKeyObjectifyService.factory().getKey(organization),然后将其持久化。我已经不喜欢我必须手动遍历每个子对象,但是由于代理类的存在,使用 RequestFactory 会使一切变得更加复杂。我将如何定义组织和组织代理类 - 使用 Key 或没有它?我必须在组织中定义这样的东西吗?

public void setContactPeople(List<Person> contactPeople)
{
    for (int i = 0; i < contactPeople.size(); ++i)
    {
        DAOBase dao = new DAOBase();
        Key<Organization> key = dao.ofy().put(this);
        contactPeople.get(i).setOrganizationKey(key);
    }
    this.contactPeople = contactPeople;
}

我将如何从 Datastore 加载 Organization 及其子项?我是否必须手动获取每个 Person 并在 @PostLoad 方法中填写 Organization.contactPeople ?

看来我必须编写大量维护代码才能完成 JPA/JDO 在幕后所做的事情。我只是不明白:(

我是否遗漏了什么或者这是实现它的唯一方法?

非常感谢您提前回答!!!

【问题讨论】:

  • 经过更多的谷歌搜索和阅读之后,似乎我必须手动完成所有操作。再加上考虑限制谷歌数据存储的父子关系,即无法与多个父母重复使用孩子,我得出结论,我的所有实体都必须是数据存储术语中的根实体。这让我想到另一个想法,也许我应该尝试Twig

标签: java google-app-engine one-to-many requestfactory objectify


【解决方案1】:

仅当您要在此Organization 中的所有Person 的事务中使用它时,您才需要将其设为@Parent。我确定这不是你想要的。

只保存private Key&lt;Organization&gt; organizationKey就足够了,当你需要为指定的Organization找到Person时,通过这个字段过滤

关于加载所有引用的对象 - 是的,您必须手动加载它。是pita,但代码不多。

此外,如果您的组织足够小并且由数百人组成,则可以使用不同的方式来存储这种关系。在这种情况下,您可以拥有List&lt;Key&lt;Person&gt;&gt; contactPeopleKey;,并通过现有的Key 手动加载所有这些人,这比通过新查询加载要快得多

【讨论】:

  • List&lt;Key&lt;Person&gt;&gt; 最糟糕的是,我无法自动将 Organization 类与 RequestFactory 对应的 OrganizationProxy 类匹配。这意味着每个逻辑实体必须有 三个 (!!) 类。一个用于与 Objectify 一起使用,第二个是服务器端 POJO,第三个是 POJO 的客户端代理。听起来很奇怪。你知道这个问题是否可以更优雅地解决吗? Спасибо!
  • 您可以将其用作 2 个字段 - contactPeopleKeyscontactPeople?第一个是标准存储字段,第二个(将在 PostLoad 中填写)仅用于匹配? PS 实际上我无法用OrganizationProxy 完全理解这个想法。 Пожалуйста :)
  • 我想我必须将 List&lt;Person&gt; contactPeople 标记为 @Transient ?嗯..好点。谢谢你的主意。而here是RequestFactory框架中代理的解释。
  • 我与 Objectify 的斗争仍在继续。我无法在PrePersist 处理程序中对孩子进行漂亮可爱的序列化。看看这个:stackoverflow.com/questions/7830421/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多