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);
生成的行布局(使用数据存储级别的重复属性)为:
one.foo: ["foo1", "foo2", "foo3", "foo4"]
one.two.bar: ["bar1", "bar2", "bar3", "bar4"]