1

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

当我尝试保留地图时,问题就来了。我的豆子看起来像这样:

@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 Datastore 的expando功能。

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

异常详情:

原因:com.googlecode.objectify.impl.load.EmbeddedMapSetter.safeSet(EmbeddedMapSetter.java:65) com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364) 的 java.lang.NullPointerException .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) 在 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.爪哇:35)

4

2 回答 2

4

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

Objectify4 广泛支持地图,包括这些扩展样式地图:

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

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

不幸的是,Objectify4 的文档目前还没有准备好。但是,源代码正在被多方积极使用。如果你觉得大胆,那就从树干开始。

于 2012-02-07T02:54:49.633 回答
0

我还建议使用 Objectify 4 - 我已经升级了我的应用程序,发现它很容易做到。我特别喜欢支持 Map 类型的字段。

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

于 2012-02-07T12:52:39.943 回答