0

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

然而,持久化的 Datastore 实体将仅包含空值的集合,而不是实际的对象:

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

使用 @Embedded 保留基本类型(例如字符串)的集合或嵌入单个 TestEmbeddable 对象非常有效。有人能澄清 datanucleus-appengine 是否支持嵌入的元素集合吗?

虽然JPA 元素集合上的 datanucleus 部分仅提供了字符串集合的示例,但相应的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;

--> 不起作用。Datastore 仅保留一组空值,而不是实际的 TestEmbeddable 对象: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)

4

2 回答 2

0

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

于 2013-06-24T16:58:01.600 回答
0

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

于 2013-04-24T06:45:41.007 回答