使用Objectify和RequestFactory创建具有一对多关系的对象的适当方法是什么?

使用Objectify和RequestFactory创建具有一对多关系的对象的适当方法是什么?我已经阅读了这些库的文档,还查看了一些示例项目,例如listwidgetgwtgae2011.所有这些都使用@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手动加载所有这些人,它比新查询加载快得多

上一篇:java – Android上的RequestFactory缓慢


下一篇:如何使用RequestFactory:.with(propertyRefs)来组合对象