【问题标题】:Google datastore objectify save issue with map谷歌数据存储对象化地图保存问题
【发布时间】:2016-09-17 06:49:00
【问题描述】:

map 中只有一个元素的列表中的remove(0) 正在使map 属性从实体中消失,同时使用objectify 保存到google 数据存储区。

map”是数据存储实体中的一个属性。

Map<String, List<String>> map;

当与键 "dress" 对应的列表只有一个元素时,在以下代码之后保存会导致 map 属性从数据存储中消失,即使对应于其他键的列表具有任意数量的元素。

map.get("dress").remove(0)

注意:当列表中有多个元素时,不会发生此问题。

【问题讨论】:

  • 您的意思是在地图中包含其他元素的空列表会导致整个列表被丢弃?对我来说听起来像是一个错误。
  • 是的。只有在列表变为空时删除元素时,才会丢弃整个地图。
  • @Eric 实际上我刚刚注意到,即使您在实体中只有一个列表属性,并且当您删除列表中的最后一个元素时,整个列表也会被丢弃。我希望会有一个空列表。
  • 哦,我的评论有误。空列表是否会导致整个 map 被丢弃,还是仅导致 entry 被丢弃?后者不会让我感到惊讶,尽管我在文档中找不到任何关于它的内容。
  • 如果从列表中删除一个元素会使列表为空,则该列表所属的映射将被丢弃。另外我注意到的是,如果列表是实体中的直接条目而不是映射的一部分,那么当您删除列表中的最后一个元素时,列表条目也会被丢弃。我希望在这种情况下会有一个空列表。我猜上面两个是相关的?

标签: google-app-engine google-cloud-datastore objectify


【解决方案1】:

原来在 Objectify 版本 5.1.8 到 5.1.12 中保存地图的方式存在错误。我们升级到 5.1.13,现在可以使用了。

【讨论】:

    【解决方案2】:

    Java SDK 的默认行为如下(来自the docs):

    • Null 属性作为 null 写入数据存储区
    • 空集合作为 null 写入数据存储
    • 从数据存储中将 null 读取为 null
    • 空集合被读取为 null。

    您可以更改此设置,以便保留空列表使用

    System.setProperty(DatastoreServiceConfig.DATASTORE_EMPTY_LIST_SUPPORT, Boolean.TRUE.toString())
    

    在启用该功能之前,请务必阅读上面列出的文档部分;它列出了一些需要注意的警告。

    【讨论】:

    • 正如问题中提到的cmets,我面临的问题是地图消失了。
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多