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