【问题标题】:Persisting @ElementCollection of @Embeddable (Google App Engine, datanucleus)持久化 @Embeddable 的 @ElementCollection(Google App Engine,datanucleus)
【发布时间】: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)

【问题讨论】:

标签: java google-app-engine datanucleus


【解决方案1】:

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

【讨论】:

  • 感谢您的提示!虽然组合 @Embedded@ElementCollection 不起作用,但仅使用 @Embedded 有效,尽管我不确定它应该采用的方式。见上面的结果——这对你来说是正确的吗?关于您提到的 Google 支持 - datanucleus-appengine 是否需要为此提供明确的 JPA 支持?我认为 DataNucleus 从 JDO/JPA 层抽象出来,并且 datanucleus-appengine '仅' 为数据存储转换 DataNucleus 功能,无论使用 JDO 还是 JPA...
  • 此外,我刚刚注意到 JPA 实现(可能与 JDO 相同?)显然不会跟踪可嵌入对象集合的更改,@Embedded 以及 @Lob,如果未明确标记为脏。不过,它适用于字符串(@ElementCollection@Embedded)。
  • 是的,他们的插件必须利用元数据中只有 JPA 才有的一些东西。唯一要说的就是使用他们插件的最新 SVN 主干(因为它已经有一段时间没有发布了,可能会或可能不会影响事情),当遇到问题时,您将它们报告给他们的问题跟踪器code.google.com/p/datanucleus-appengine,因为谷歌可能不在乎监控一些 Stackoverflow 标签
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多