【发布时间】:2013-04-17 02:52:34
【问题描述】:
我正在尝试使用 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 element collections 上的 datanucleus 部分仅提供了字符串集合的示例,但相应的 JDO section 使用自定义的仅嵌入类型。 feature list 进一步指出嵌入式集合通常与 GAE 兼容,但没有说明是否支持自定义类型。我还发现另一个人声称this should work。
-- 编辑--
根据 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)
【问题讨论】:
-
你试过code.google.com/p/objectify-appengine。这个 API 为你的开发封装了很多东西。
标签: java google-app-engine datanucleus