Objectify嵌入式地图无法检索

时间:2012-02-01 14:57:45

标签: google-app-engine datastore objectify expando

我在我的GoogleAppEngine托管应用程序中使用Objectify作为数据访问层。

当我试图坚持地图时,问题出现了。我的bean看起来像这样:

@Entity
@Cached
class MyBean{
    @Id 
    private Long id;
    @Embedded
    Map<String, String> parameters = new HashMap<String, String>();

    public MyBean(){}

    //getters and setters below
}

首先请注意,地图'参数'不是私有的,它抛出了一个JRE异常。 保存地图时一切顺利。从DataStore中检索它时失败。

我的解决方法是使用@Serialized注释。这只是一种解决方法,因为我想要实现的是使用GAE数据存储区的expando功能。

根据objectify doc我正在做正确的操作。

异常详情:

  

引起:java.lang.NullPointerException at   com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364)     在   com.googlecode.objectify.impl.load.EmbeddedMapSetter.safeSet(EmbeddedMapSetter.java:65)     在   com.googlecode.objectify.impl.load.C​​ollisionDetectingSetter.set(CollisionDetectingSetter.java:37)     在   com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:359)     在com.googlecode.objectify.impl.Transmog.load(Transmog.java:340)at   com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:203)     在   com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:668)     在   com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:657)     在   com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator.java:35)

2 个答案:

答案 0 :(得分:4)

嵌入式地图在Objectify3中得不到很好的支持,不应该公开宣布。关于@Embedded Map的部分已从Objectify3文档中删除。

Objectify4广泛支持地图,包括这些expando风格的地图:

  • 地图(或任何原语)
  • 地图(主要参考)
  • 地图(嵌入式课程

此外,还有一个@Mapify注释,可以让您获取正常的对象集合,选择一个属性作为键,并将其存储为Map。

不幸的是,Objectify4的文档目前还没有准备好。但是,源代码由多方主动使用。如果你觉得大胆,那就从树干上建造。

答案 1 :(得分:0)

我还建议使用Objectify 4 - 我升级了我的应用程序并发现它相当容易。我更喜欢支持Map类型的字段。

要回答这个问题,你不应该将@Embedded放在只包含基元的数组上。因此,您无需在地图上指定@Embedded,因为String在Google App Engine数据存储区中是原始的。