我正在尝试使用JPA2 @ElementCollection注释将JPA实体与一组自定义@Embeddable对象一起保留。简单的例子(两个类都由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;
}
但是,持久化的数据存储区实体只包含空值的集合,而不是实际的对象:
TestEntity.testEmbeddables = [null, null, ...]
保留一组基本类型(如字符串)或使用@Embedded嵌入单个TestEmbeddable对象非常合适。 是否有人能够澄清dateducleus-appengine是否支持嵌入式元素集合?
虽然JPA element collections上的datanucleus部分仅给出了String集合的示例,但相应的JDO section使用自定义的仅嵌入式类型。 feature list进一步指出嵌入式集合通常与GAE兼容,但没有说明是否支持自定义类型。我还发现另一个人声称this should work。
- 编辑 -
在DataNucleus的回答之后,我又进行了一些测试:
@ElementCollection
private List<String> stringsElementCollection;
- &GT;作品。各个字符串被持久化为TestEntity.stringsElementCollection = [str1,str2,...]
@Embedded
private List<String> stringsEmbedded;
- &GT;与@ElementCollection相同。我想知道JPA规范是否涵盖了@Embedded对集合的使用吗?
@ElementCollection
private List<TestEmbeddable> embeddablesElementCollection;
- &GT;不行。数据存储区仅保留空值的集合,而不是实际的TestEmbeddable对象:TestEntity.embeddablesElementCollection = [null,null,...]
@Embedded
private List<TestEmbeddable> embeddablesEmbedded;
- &GT;这似乎有效。 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)
答案 0 :(得分:0)
不知道Google是否支持使用JPA嵌入此类对象的集合。那只是为JDO开发的并且在那里工作。您可以尝试在嵌入字段上放置@Embedded以强化其嵌入式的想法。
答案 1 :(得分:0)
David Geiger在这里记录了这个问题: https://code.google.com/p/datanucleus-appengine/issues/detail?id=318