4

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

@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;
}

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

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 并在方法中填写 Organization.contactPeople @PostLoad

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

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

非常感谢提前回答!!!

4

1 回答 1

1

您需要将其设置为@Parent仅当您要在事务中使用它时才对Personthis中的 all 使用它Organization。我确定这不是你想要的。

保存就够private Key<Organization> organizationKeyPersonOrganization

至于加载所有引用的对象 - 是的,您必须手动加载它。这是皮塔饼,但它不是很多代码。

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

于 2011-10-19T05:24:47.037 回答