持久保存@Embeddable的@ElementCollection(Google App Engine,datanucleus)

我正在尝试使用JPA2 @ElementCollection批注将JPA实体与一组自定义@Embeddable对象一起持久化。 简单的例子(这两个类都通过datanucleus增强):

@Entity public class TestEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ElementCollection private Set testEmbeddables; public Set testEmbeddables() { return this.testEmbeddables; } } @Embeddable public class TestEmbeddable implements Serializable { public String s; } 

但是,持久化的数据存储区实体只包含空值的集合,而不是实际的对象:

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

保留一组基本类型(如字符串)或使用@Embedded嵌入单个TestEmbeddable对象非常合适。 是否有人能够澄清是否可以通过datanucleus-appengine支持嵌入式元素集合?

虽然JPA元素集合上的datanucleus部分仅给出了String集合的示例,但相应的JDO部分使用自定义的仅嵌入式类型。 function列表进一步指出嵌入式集合通常与GAE兼容,但没有说明是否支持自定义类型。 我还发现另一个人声称这应该有效 。

– 编辑 –

在DataNucleus回答之后,我又进行了一些测试:

 @ElementCollection private List stringsElementCollection; 

– >作品。 各个字符串被持久化为TestEntity.stringsElementCollection = [str1,str2,…]

 @Embedded private List stringsEmbedded; 

– >与@ElementCollection相同。 我想知道JPA规范是否涵盖了@Embedded对集合的使用?

 @ElementCollection private List embeddablesElementCollection; 

– >不起作用。 数据存储区仅保留空值的集合,而不是实际的TestEmbeddable对象:TestEntity.embeddablesElementCollection = [null,null,…]

 @Embedded private List 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)

不知道Google是否支持使用JPA嵌入此类对象的集合。 那只是为JDO开发的并且在那里工作。 您可以尝试在嵌入字段上放置@Embedded以强化其嵌入式的想法。

David Geiger在此处记录了此问题: https : //code.google.com/p/datanucleus-appengine/issues/detail? id = 318