0

JPA2 @ElementCollectionアノテーションを使用して、カスタム @Embeddable オブジェクトのコレクションで JPA エンティティを永続化しようとしています。簡単な例 (両方のクラスが datanucleus によって強化されています):

@Entity
public class TestEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ElementCollection
    private Set<TestEmbeddable> testEmbeddables;

    public Set<TestEmbeddable> testEmbeddables() {
        return this.testEmbeddables;
    }
}

@Embeddable
public class TestEmbeddable implements Serializable {
    public String s;
}

ただし、永続化されたデータストア エンティティには、実際のオブジェクトではなく、null 値のコレクションのみが含まれます。

TestEntity.testEmbeddables = [null, null, ...]

String などの基本型のコレクションを永続化するか、@Embedded を使用して単一の TestEmbeddable オブジェクトを埋め込むと、問題なく機能します。埋め込み可能な要素のコレクションが datanucleus-appengine でサポートされているかどうかを誰かが明確にすることができますか?

JPA 要素コレクションの datanucleus セクションでは String コレクションの例のみが示されていますが、対応するJDO セクションでは組み込み専用のカスタム タイプが使用されています。機能リストには、一般に埋め込みコレクションが GAE と互換性があるとさらに記載されていますが、カスタム型がサポートされているかどうかは記載されていません。また、これが機能するはずだと主張する別の人を見つけました。

- 編集 -

DataNucleus の回答に従って、さらにいくつかのテストを実行しました。

@ElementCollection
private List<String> stringsElementCollection;

--> 動作します。個々の文字列は TestEntity.stringsElementCollection = [str1, str2, ...] として永続化されます。

@Embedded
private List<String> stringsEmbedded;

--> @ElementCollection と同じ。しかし、JPA 仕様がコレクションでの@Embeddedの使用をカバーしているのだろうか?

@ElementCollection
private List<TestEmbeddable> embeddablesElementCollection;

--> 機能しません。実際の TestEmbeddable オブジェクトの代わりに、Datastore は null 値のコレクションのみを保持します: TestEntity.embeddablesElementCollection = [null, null, ...]

@Embedded
private List<TestEmbeddable> embeddablesEmbedded;

--> これはうまくいくようです。TestEmbeddable.s フィールドは、TestEntity.s.0、.s.1、および TestEntity.embeddablesEmbedded.size プロパティとして格納されます。

(App Engine SDK 1.7.7.1、datanucleus 3.1.3、datanucleus-appengine 2.1.2)

4

2 に答える 2

0

Google がそのようなオブジェクトの埋め込みコレクションをまだ JPA でサポートしているかどうかはわかりません。これは JDO 用にのみ開発され、そこで動作します。@Embedded を埋め込みフィールドに配置して、埋め込まれているという考えを強化することができます。

于 2013-04-24T06:45:41.007 に答える