持久保存@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