坚持@Embeddable的@ElementCollection(Google App Engine,datanucleus)

时间:2013-04-23 18:51:07

标签: java google-app-engine datanucleus

我正在尝试使用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)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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