Objectify 5保存嵌入的List列表或数组数组?

时间:2015-06-25 17:23:27

标签: java google-app-engine objectify

我正在将代码从对象4转换为5.

之前我保存的@Entity包含一个包含

的类
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级别放在自己的类中,但这似乎很奇怪,因为docs表示“Objectify4的许多限制不再适用于Objectify5:嵌套的集合嵌入对象不受限制。“

更新:某些字段在ofy4版本中使用@Serialize进行了注释。我删除了这些认为他们在ofy5中不需要的东西,以便解释差异。仍然想知道是否可以在没有@Serialize的情况下执行此操作。包装类似乎可以模拟List<List<String>,但不能用于更复杂的嵌套。

更新2: 使用v5,不适用于递归类?即如果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)

或许有一种方法可以指定翻译者的递归级别数量?

1 个答案:

答案 0 :(得分:0)

主要客观化作者。

Objectify4不能保存List<List<String>>类型的字段。我甚至无法想象它会做什么,或者它为什么会起作用。周围没有测试。从历史上看,GAE只允许在实体中存储一组简单的标量值。在某些时候,他们通过提供EmbeddedEntity来扩展它,但这是不同的。我没有尝试使用低级api手动存储List<List<String>>,但如果它有效,那么这是谷歌尚未公布的新内容,也没有记录它。似乎也没有任何方法可以在GAE / Python(db或ndb)中定义这样的结构。

所以我不知道该告诉你什么。如果你告诉我你有一个工作应用程序来存储和检索List<List<String>>字段 - 那么这是新的东西。你有多长时间部署了这个?