【发布时间】:2011-12-10 13:08:29
【问题描述】:
使用 Objectify 和 RequestFactory 创建具有一对多关系的对象的适当方法是什么?我已经阅读了这些库的文档,还查看了一些示例项目,例如 listwidget 和 gwtgae2011。他们都使用@Embedded 注释,这不是我想要的,因为它将所有内容都存储在一个实体中。根据文档的另一个选择是在子类中使用 @Parent 属性。在我的示例中(为简单起见,删除了 getters/setters)我有实体 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;
}
现在,如果我正确理解了文档以便将组织与一个人持久化,我必须先持久化组织,然后为 Person 对象设置 organizationKey 到 ObjectifyService.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