Java 持久化@Embeddeble的@ElementCollection(谷歌应用程序引擎、datanucleus)
我正在尝试使用JPA2注释将一个JPA实体与一组自定义@Embeddeble对象持久化。简单示例(两个类都由datanucleus增强): 使用@Embedded持久化一组基本类型(如字符串)或嵌入一个TestEmbeddable对象效果非常好是否有人能澄清datanucleus appengine是否支持嵌入的元素集合? 上的datanucleus部分仅给出了字符串集合的示例,而相应的部分使用了自定义的仅嵌入类型。进一步说明嵌入式集合通常与GAE兼容,但没有说明是否支持自定义类型。我还发现另一个人声称 --编辑-- 根据DataNucleus的回答,我又进行了一些测试:Java 持久化@Embeddeble的@ElementCollection(谷歌应用程序引擎、datanucleus),java,google-app-engine,datanucleus,Java,Google App Engine,Datanucleus,我正在尝试使用JPA2注释将一个JPA实体与一组自定义@Embeddeble对象持久化。简单示例(两个类都由datanucleus增强): 使用@Embedded持久化一组基本类型(如字符串)或嵌入一个TestEmbeddable对象效果非常好是否有人能澄清datanucleus appengine是否支持嵌入的元素集合? 上的datanucleus部分仅给出了字符串集合的示例,而相应的部分使用了自定义的仅嵌入类型。进一步说明嵌入式集合通常与GAE兼容,但没有说明是否支持自定义类型。我还发现另一
@ElementCollection
private List<String> stringsElementCollection;
@ElementCollection
私有列表stringsElementCollection;
-->工作。单个字符串被持久化为TestEntity.stringsElementCollection=[str1,str2,…]
@Embedded
private List<String> stringsEmbedded;
@Embedded
私有列表字符串化;
-->与@ElementCollection相同。不过,我想知道JPA规范是否涵盖了对集合的使用
@ElementCollection
private List<TestEmbeddable> embeddablesElementCollection;
@ElementCollection
私有列表嵌入元素集合;
-->不起作用。与实际的TestEmbeddable对象不同,数据存储只保留一个空值集合:TestEntity.EmbeddedableElementCollection=[null,null,…]
@Embedded
private List<TestEmbeddable> embeddablesEmbedded;
@Embedded
可嵌入的私有列表;
-->这似乎奏效了。TestEmbeddable.s字段存储为TestEntity.s.0、.s.1等加上TestEntity.embeddedablesembedded.size属性
(App Engine SDK 1.7.7.1、datanucleus 3.1.3、datanucleus appengine 2.1.2)不知道Google是否支持JPA嵌入的此类对象集合。这只是为JDO开发的,并在那里工作。您可以尝试在嵌入字段中添加@Embedded,以强化其嵌入的想法。David Geiger在此处记录了该问题:
你试过了吗。这个API为您的开发封装了很多东西。谢谢您的提示!虽然将
@Embedded
和@ElementCollection
组合起来不起作用,但仅使用@Embedded
是有效的,尽管我不确定它应该以什么方式工作。查看上面的结果-你觉得这样对吗?关于您提到的谷歌支持,datanucleus appengine是否需要为此提供明确的JPA支持?我认为DataNucleus是从JDO/JPA层抽象出来的,DataNucleus appengine“仅”翻译数据存储的DataNucleus功能,而不管是使用JDO还是JPA……此外,我刚刚注意到JPA实现(可能与JDO相同?)显然不会跟踪可嵌入对象集合的更改,如果未明确标记为脏,则使用@Embedded
以及@Lob
。不过,它适用于字符串(@ElementCollection
和@Embedded
)。是的,他们的插件必须利用元数据中只有JPA才有的东西。唯一要说的是使用他们插件的最新SVN主干(因为这已经有一段时间没有发布了,可能会也可能不会影响事情),当出现问题时,你可以向他们的问题跟踪者报告,因为谷歌可能不太关心监控一些Stackoverflow标签
@ElementCollection
private List<TestEmbeddable> embeddablesElementCollection;
@Embedded
private List<TestEmbeddable> embeddablesEmbedded;