すべての @PersistenceCapable データ クラスは、他のデータ クラスへの埋め込みオブジェクトとして使用できます。クラスの @Persistent フィールドはオブジェクトに埋め込まれます。埋め込み対象のクラスに @EmbeddedOnly アノテーションを付加すると、埋め込みクラスとしてのみ使用できるようになります。埋め込みクラスが独立したエンティティとして格納されることはないため、主キー フィールドは必要ありません。
次に埋め込みクラスの例を示します。この例では、埋め込みクラスを、それを使用するクラスの内部クラスにしています。この方法はクラスを埋め込み可能にする上で便利ですが、必須というわけではありません。
import javax.jdo.annotations.Embedded;
import javax.jdo.annotations.EmbeddedOnly;
// ... imports ...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class EmployeeContacts {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
Long id;
@PersistenceCapable
@EmbeddedOnly
public static class ContactInfo {
@Persistent
private String streetAddress;
@Persistent
private String city;
@Persistent
private String stateOrProvince;
@Persistent
private String zipCode;
// ... accessors ...
}
@Persistent
@Embedded
private ContactInfo homeContactInfo;
}
埋め込みクラスのフィールドは、エンティティのプロパティとして格納されます。その際には、各フィールドの名前と、それに対応するプロパティの名前が使用されます。オブジェクトに埋め込みクラス型のフィールドが複数ある場合は、フィールドの名前を変更して競合しないようにする必要があります。新しいフィールド名は、@Embedded アノテーションへの引数を使用して指定します。次に例を示します:
@Persistent
@Embedded
private ContactInfo homeContactInfo;
@Persistent
@Embedded(members = {
@Persistent(name="streetAddress", columns=@Column(name="workStreetAddress")),
@Persistent(name="city", columns=@Column(name="workCity")),
@Persistent(name="stateOrProvince", columns=@Column(name="workStateOrProvince")),
@Persistent(name="zipCode", columns=@Column(name="workZipCode")),
})
private ContactInfo workContactInfo;
同様に、埋め込みオブジェクトのフィールド名が変更されていない場合は、オブジェクトのフィールド名が埋め込みクラスのフィールド名と競合しないようする必要があります。
埋め込みクラスの永続プロパティは他のフィールドと同じエンティティに格納されるため、埋め込みクラスの永続フィールドは JDOQL クエリ フィルタや並び替え順序に使用できます。埋め込みフィールドは、外部フィールドの名前、ドット(.)、および埋め込みフィールドの名前を使用して参照できます。この方法は、埋め込みフィールドのプロパティ名が @Column アノテーションによって変更されたかどうかに関係なく機能します。
select from EmployeeContacts where workContactInfo.zipCode == "98105"
参照元:
http://code.google.com/intl/ja/appengine/docs/java/datastore/dataclasses.html
0 件のコメント:
コメントを投稿