【问题标题】:"HashMap is not a supported property type" - embedding a map with Objectify 4“HashMap 不是受支持的属性类型” - 使用 Objectify 4 嵌入地图
【发布时间】:2014-03-11 18:03:19
【问题描述】:

我正在尝试使用 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。当我尝试保存实体时,这会导致运行时错误。

然后我读到了 @EmbedMap,这是 ofy 的最新成员。所以我尝试了以下格式:

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)

有什么建议吗?

【问题讨论】:

    标签: java google-cloud-datastore objectify


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我想在各种情况下使用它来将 Long 值(数据存储 ID)映射到对象或整数。条目的数量从 5 到 500 不等。我曾假设 @Map 只是公开了一个相当复杂的数据存储功能。既然你已经解释过了,我想我现在应该使用@Serialize,然后在/如果我需要查询集合时考虑替代方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2019-03-17
      • 2018-12-31
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多