Objectify 5 保存嵌入的列表列表或数组数组?
Objectify 5 save an embedded List of List or array of arrays?
我正在将代码从 objectify 4 转换为 5。
之前我保存的 @Entity
包含一个 class 包含
List<List<String>> listOfListOfStrings;
对于版本 5,我得到一个 SaveException:
com.googlecode.objectify.SaveException:
Error saving com.timmacp.server.OfyEntityClass@3d627804:
listOfListOfStrings: java.util.ArrayList is not a supported property type`
数组的数组也有同样的问题。
这是我用来测试的一些代码,MemberClass
只包含一个 String
.
@Entity
public class OfyEntityClass {
@Id
private Long ID;
List<List<MemberClass>> memberClassObjects;
public OfyEntityClass(){
memberClassObjects=new ArrayList<List<MemberClass>>(8);
List<MemberClass> l=new ArrayList<MemberClass>(8);
MemberClass memberClassObject=new MemberClass();
l.add(memberClassObject);
memberClassObjects.add(l);
}
}
解决方法似乎是将每个 List
级别放在自己的 class 中,但这似乎很奇怪,因为 docs 声明 "Many limitations of Objectify4 no longer apply to Objectify5: Nesting of collections of embedded objects is unrestricted."
更新:部分字段在ofy4版本中被注释为@Serialize
。我删除了这些认为它们在 ofy5 中不需要的东西,这样就解释了差异。仍然想知道是否可以在没有 @Serialize
的情况下做到这一点。包装器 classes 似乎可以模拟 List<List<String>
但不适用于更复杂的嵌套。
更新 2:
使用 v5,不能使用递归 class?即如果 Thing 有一个类型的字段
List<Thing>
然后(到目前为止)注册失败:堆栈跟踪看起来像无限重复:
at com.googlecode.objectify.impl.translate.Translators.create(Translators.java:138)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:117)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.translate.CollectionTranslatorFactory.create(CollectionTranslatorFactory.java:38)
at com.googlecode.objectify.impl.translate.Translators.create(Translators.java:138)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:117)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.translate.ClassPopulator.<init>(ClassPopulator.java:88)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEmbeddedClassTranslator(ClassTranslatorFactory.java:75)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:50)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:36)
或者也许有一种方法可以为翻译器指定递归级别的数量?
这里是 Objectify 的主要作者。
Objectify4 应该无法保存 List<List<String>>
类型的字段。我什至无法想象那会做什么,或者为什么会起作用。周围没有测试。从历史上看,GAE 只允许在实体中存储一个简单的标量值集合。在某些时候,他们通过提供 EmbeddedEntity
来扩展它,但这是不同的。我没有尝试用低级 api 手动存储 List<List<String>>
,但如果它有效,那是 Google 尚未宣布也没有记录的新事物。在 GAE/Python(db 或 ndb)中似乎也没有任何方法可以定义这样的结构。
所以我不知道该告诉你什么。如果您告诉我您有一个 working 应用程序可以存储和检索 List<List<String>>
字段 - 那么这就是新事物。您部署了多长时间?
我正在将代码从 objectify 4 转换为 5。
之前我保存的 @Entity
包含一个 class 包含
List<List<String>> listOfListOfStrings;
对于版本 5,我得到一个 SaveException:
com.googlecode.objectify.SaveException:
Error saving com.timmacp.server.OfyEntityClass@3d627804:
listOfListOfStrings: java.util.ArrayList is not a supported property type`
数组的数组也有同样的问题。
这是我用来测试的一些代码,MemberClass
只包含一个 String
.
@Entity
public class OfyEntityClass {
@Id
private Long ID;
List<List<MemberClass>> memberClassObjects;
public OfyEntityClass(){
memberClassObjects=new ArrayList<List<MemberClass>>(8);
List<MemberClass> l=new ArrayList<MemberClass>(8);
MemberClass memberClassObject=new MemberClass();
l.add(memberClassObject);
memberClassObjects.add(l);
}
}
解决方法似乎是将每个 List
级别放在自己的 class 中,但这似乎很奇怪,因为 docs 声明 "Many limitations of Objectify4 no longer apply to Objectify5: Nesting of collections of embedded objects is unrestricted."
更新:部分字段在ofy4版本中被注释为@Serialize
。我删除了这些认为它们在 ofy5 中不需要的东西,这样就解释了差异。仍然想知道是否可以在没有 @Serialize
的情况下做到这一点。包装器 classes 似乎可以模拟 List<List<String>
但不适用于更复杂的嵌套。
更新 2:
使用 v5,不能使用递归 class?即如果 Thing 有一个类型的字段
List<Thing>
然后(到目前为止)注册失败:堆栈跟踪看起来像无限重复:
at com.googlecode.objectify.impl.translate.Translators.create(Translators.java:138)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:117)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.translate.CollectionTranslatorFactory.create(CollectionTranslatorFactory.java:38)
at com.googlecode.objectify.impl.translate.Translators.create(Translators.java:138)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:117)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.translate.ClassPopulator.<init>(ClassPopulator.java:88)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEmbeddedClassTranslator(ClassTranslatorFactory.java:75)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:50)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:36)
或者也许有一种方法可以为翻译器指定递归级别的数量?
这里是 Objectify 的主要作者。
Objectify4 应该无法保存 List<List<String>>
类型的字段。我什至无法想象那会做什么,或者为什么会起作用。周围没有测试。从历史上看,GAE 只允许在实体中存储一个简单的标量值集合。在某些时候,他们通过提供 EmbeddedEntity
来扩展它,但这是不同的。我没有尝试用低级 api 手动存储 List<List<String>>
,但如果它有效,那是 Google 尚未宣布也没有记录的新事物。在 GAE/Python(db 或 ndb)中似乎也没有任何方法可以定义这样的结构。
所以我不知道该告诉你什么。如果您告诉我您有一个 working 应用程序可以存储和检索 List<List<String>>
字段 - 那么这就是新事物。您部署了多长时间?