“HashMap不是受支持的属性类型” - 使用Objectify 4嵌入地图

时间:2014-03-11 18:03:19

标签: java google-cloud-datastore objectify

我尝试使用Objectify 4(和GAE SDK 1.9.0)在一个实体中嵌入地图。

docs (here)显示如下内容:

@Embed
class LevelTwo {
    String bar;
}

@Entity
class EntityWithEmbeddedCollection {
    @Id Long id;
    List<LevelOne> ones = new ArrayList<LevelOne>();
}

所以首先我尝试做同样的事情但是使用HashMap&lt; Long,LevelTwo&gt;。当我尝试保存实体时,这会导致运行时错误。

然后我读到了@EmbedMap,这是最近添加的。所以我尝试了以下表格:

class LevelTwo {
    Integer one;
    Boolean bee;
}

class EntityWithEmbeddedCollection {
    @Id Long id;
    @EmbeddedMap
    Map<Long, LevelTwo> ones = new HashMap<Long, LevelTwo>();
}

我也尝试过将LevelTwo作为内部静态类和其他一些变体,但我总是得到:

com.googlecode.objectify.SaveException:
Error saving com.myapp.UserInfoSvr@96: items: java.util.HashMap is not a supported property type.
    at com.googlecode.objectify.impl.Transmog.save(Transmog.java:105)

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

读者应注意,在2014-03-28发布了Objectify 4.1,它对嵌入处理做了重大改变(与本文相关)。谷歌的低级数据存储API最近有所改进,这是一项重大改进。

公告在这里:
https://groups.google.com/forum/#!topic/objectify-appengine/sbhig-wCDnI

答案 1 :(得分:0)

@EmbedMap仅适用于String键,它通过在实体上创建一个看起来像“foo.bar.yourkeyhere”的属性来工作。这不是一个非常复杂的机制。

你到底想要做什么?您可能还希望考虑Mapify注释和嵌入式集合。

相关问题