【问题标题】:Equivalent of a repeated NDB StructuredProperty in JPA/JDO on Google App Engine等效于 Google App Engine 上 JPA​​/JDO 中重复的 NDB StructuredProperty
【发布时间】:2013-04-17 20:20:54
【问题描述】:

NDB 中的StructuredProperties 列表由多个重复属性建模,StructuredProperty's 模型类的每个属性一个重复属性。 (见这里:https://developers.google.com/appengine/docs/python/ndb/properties#structured.

我在 Google App Engine 上使用 JPA 找到的封闭等效项是 @Embedded 列表 @Embeddables。但是,存储格式现在不同了。 JPA 的 GAE/J 插件为每个嵌入实体的每个属性生成一列(参见此处:http://datanucleus-appengine.googlecode.com/svn-history/r979/trunk/src/com/google/appengine/datanucleus/StoreFieldManager.java)。 (例如,对于长列表,这会生成包含许多列的行。)

是否有一种简单的内置方法可以复制 NDB 使用 JPA 或 JDO 处理重复复合值的方法?

添加:

对于那些比 Python 更熟悉 Java 的人,我发现基于 Java 的 Objectify 框架以与 Python 上的 NDB 相同的方式存储嵌入式类的集合:http://code.google.com/p/objectify-appengine/wiki/Entities#Embedding,这是我希望使用 JPA 实现的方式(或 JDO):

为方便起见,我在这里复制他们的示例:

import com.googlecode.objectify.annotation.Embed;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;

@Embed
class LevelTwo {
    String bar;
}

@Embed
class LevelOne {
    String foo;
    LevelTwo two
}

@Entity
class EntityWithEmbeddedCollection {
    @Id Long id;
    List<LevelOne> ones = new ArrayList<LevelOne>();
}

使用此设置,运行以下代码:

EntityWithEmbeddedCollection ent = new EntityWithEmbeddedCollection();
for (int i=1; i<=4; i++) {
    LevelOne one = new LevelOne();
    one.foo = "foo" + i;
    one.two = new LevelTwo();
    one.two.bar = "bar" + i;

    ent.ones.add(one);
}

ofy().save().entity(ent);

生成的行布局(使用数据存储级别的重复属性)为:

ones.foo: ["foo1", "foo2", "foo3", "foo4"]

ones.two.bar: ["bar1", "bar2", "bar3", "bar4"]

【问题讨论】:

  • 定义 java 类而不是参考一些 Python 语法。完成后,有人可以回应如何使用 JDO 或 JPA 持久化它
  • 添加了一些如何使用 Objectify 完成的代码(无需提及 Python)。

标签: google-app-engine jpa datanucleus app-engine-ndb


【解决方案1】:

Google 的嵌入式集合的 JDO/JPA 插件定义在 https://code.google.com/p/datanucleus-appengine/issues/detail?id=258&can=1&q=embedded&colspec=ID%20Stars%20Type%20Status%20Priority%20FoundIn%20TargetRelease%20Owner%20Summary

如果您想对它的存储方式进行其他定义(并且可以通过多种方式存储它),那么您会在 Google 的问题跟踪器上提出问题(并且如果您希望该功能早点而不是晚点,然后提供一些资源来实现它)

【讨论】:

  • 感谢您提供规范的链接。
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多