我尝试使用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)
有什么建议吗?
答案 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注释和嵌入式集合。