ObjectifyとRequestFactoryを使用して、1対多数の関係を持つオブジェクトを作成する適切な方法は何ですか?
-
26-10-2019 - |
質問
ObjectifyとRequestFactoryを使用して、1対多数の関係を持つオブジェクトを作成する適切な方法は何ですか?これらのライブラリのドキュメントを読み、などのサンプルプロジェクトの数も確認しました。 ListWidget と GWTGAE2011. 。それらはすべて使用します @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;
}
今、私が一人の人と組織を維持するためにドキュメントを正しく理解した場合、私は最初に組織を維持する必要があります。 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;
}
また、データストアの子供たちと組織をロードするにはどうすればよいですか?すべての人を手動で取得し、組織に記入する必要がありますか。 @PostLoad
方法 ?
JPA/JDOが舞台裏で行うことを行うためだけに、多くのメンテナンスコードを書く必要があるようです。私は単にそれを手に入れません:(
私は何かが足りないのですか、それともそれを実装する唯一の方法ですか?
事前に答えてくれてありがとう!!!
解決
あなたはそれをそのようにする必要があります @Parent
すべてに対するトランザクションでそれを使用する場合にのみ Person
これで Organization
. 。私はそれがあなたが望むものではないと確信しています。
ただ節約するのに十分です private Key<Organization> organizationKey
, 、そしてあなたが見つける必要があるときにこのフィールドでフィルター Person
指定されています Organization
参照されるすべてのオブジェクトをロードすることについて - はい、そうです、あなたはそれを手動でロードする必要があります。それはピタですが、それは多くのコードではありません。
また、組織が十分に小さく、数百人で構成されている場合、この関係を保存する別の方法があります。この場合、あなたが持つことができます List<Key<Person>> contactPeopleKey;
, 、そして、既存のすべての人々をロードします Key
, 、手動では、新しいクエリによる読み込みよりもはるかに高速です