4

ObjectifyとRequestFactoryを使用して1対多の関係を持つオブジェクトを作成する適切な方法は何ですか?これらのライブラリのドキュメントを読み、 listwidgetgwtgae2011などのサンプルプロジェクトの数も確認しました。@Embeddedそれらはすべて、1つのエンティティ内にすべてを格納するため、私が望むものではない注釈を使用します。ドキュメントによる別のオプション@Parentは、子クラスでプロパティを使用することです。私の例では(簡単にするためにゲッター/セッターは削除されています)、エンティティが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;
}

これで、1人の個人で組織を永続化するためにドキュメントを正しく理解した場合、最初に組織を永続化し、次にPersonオブジェクトに設定organizationKeyしてから永続化する必要があります。ObjectifyService.factory().getKey(organization)すべての子オブジェクトを手動で反復処理する必要があることはすでに好きではありませんが、RequestFactoryを使用すると、プロキシクラスが存在するため、すべてがより複雑になります。組織クラスと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からOrganizationとその子をどのようにロードしますか?すべてのPersonを手動で取得し、@PostLoadメソッドでOrganization.contactPeopleに入力する必要がありますか?

JPA / JDOが舞台裏で行うことを行うためだけに、たくさんのメンテナンスコードを書かなければならないようです。私は単にそれを取得しません:(

私は何かが足りないのですか、それともそれを実装する唯一の方法ですか?

事前に回答ありがとうございます!!!

4

1 に答える 1

1

あなたはこれ@Parentのすべてに対してトランザクションでそれを使用しようとしているときだけそれを作る必要があります。それはあなたが望むものではないと確信しています。PersonOrganization

を保存するだけprivate Key<Organization> organizationKeyで十分であり、指定されたものを見つける必要がある場合は、このフィールドでフィルタリングしPersonますOrganization

参照されているすべてのオブジェクトをロードする場合と同様に、そうです。手動でロードする必要があります。ピタですが、コードはそれほど多くありません。

また、組織が十分に小さく、数百人で構成されている場合は、この関係を保存する別の方法があります。この場合List<Key<Person>> contactPeopleKey;、既存の手動ですべての人をロードすることができKey、新しいクエリでロードするよりもはるかに高速です。

于 2011-10-19T05:24:47.037 に答える