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)