使用Objectify和RequestFactory创建具有一对多关系的对象的适当方法是什么?我已经阅读了这些库的文档,还查看了一些示例项目,例如listwidget和gwtgae2011.所有这些都使用@Embedded注释,这不是我想要的,因为它将所有内容存储在一个实体中.根据文档的另一个选择是在子类中使用@Parent属性.在我的示例中(为简单起见,删除了getters / 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;
}
现在,如果我正确理解文档以便使用一个Person持久化组织,我必须首先保持组织,然后将organizationKey设置为ObjectifyService.factory().getKey(组织)用于Person对象,然后保留它.我已经不喜欢我必须手动迭代每个子对象,但是使用RequestFactory会因为代理类的存在而使一切变得更复杂.如何定义Organization和OrganizationProxy类 – 使用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加载组织及其子项?我是否必须手动获取每个Person并在@PostLoad方法中填写Organization.contactPeople?
看起来我不得不编写很多维护代码来执行JPA / JDO在幕后所做的事情.我根本得不到它:(
我错过了什么,或者这是实现它的唯一方法吗?
非常感谢您提前解答!
解决方法:
只有当您要在针对本组织中的所有Person的事务中使用它时,才需要将其设置为@Parent.我确定这不是你想要的.
只需保存私钥< Organization>即可. organizationKey,当您需要为指定的组织查找Person时,按此字段过滤
至于加载所有引用的对象 – 是的,它是,你必须手动加载它.它是皮塔饼,但它不是很多代码.
此外,如果您的组织足够小,并且由数百人组成,则存在这种关系的不同方式.在这种情况下,您可以拥有List< Key< Person>> contactPeopleKey;,并通过现有的Key手动加载所有这些人,它比新查询加载快得多