自分で作ったり提供したりするものは、まず自分自身で使ってみろろということです。自分じゃ使わないものなら人はいくらでも無責任にも無思考にもなれる。そういう投げやりな「サービス」やら「プロダクツ」なんて、だれだってイヤだ。自分が作り手と同時に利用者の立場になれば、ちゃんと使えるレベルのものを提供しようとします。

2010年5月11日火曜日

JDO-埋め込みクラス

埋め込みクラスを使用すると、新しいデータストア エンティティを作成したり関係を形成したりしなくても、クラスを使ってフィールド値をモデル化できます。オブジェクト値のフィールドは、保持されているオブジェクトのデータストア エンティティに直接格納されます。

すべての @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 件のコメント:

コメントを投稿

ホームページ