0

假设我已经让 Objectify4 与我的项目一起工作(尽管我仍在努力使其工作)是否可以像这样持久化带有 Map 字段的实体:

class Foo {
  Map<String, Object> map; 
  public Foo() {}
  public Foo(Map map) {
   this.map = map;
  }
}

基本思想是能够存储/保留一个“通用”字段,它可以是

  • java.lang.String
  • java.lang.Number
  • java.lang.Boolean
  • 空值
  • java.util.List
  • java.util.Map

例如我可以存储这个:

map.put("uid:sarah:fname", "Sarah");
persist(new Foo(map));

或者

map.put("uid:sarah:age", 25);
persist(new Foo(map));

这甚至可以通过 Objectify 实现吗?还是应用引擎?

4

1 回答 1

1

这将与 Objectify4 一起工作,但有几点需要注意:

  1. 您不能使用“。” 键名中的字符
  2. Object值根本不会被转换;它将是数据存储接受的任何内容。

1 是因为这最终被存储在原始实体中field.keyname(可能有几层“。”分隔嵌入字段)。

2 是因为您要删除任何类型信息,所以 Objectify 只是按原样处理 Object。就像您直接使用低级api一样;您只能存储基元或基元集合。没有数组,当然没有地图。集合总是作为列表返回。数字总是以 Long 形式返回,无论它们以何种大小存储。还有一些其他古怪的行为。

如果你真的想要这种行为,你可以创建一个自定义的 TranslatorFactory,它将在运行时内省类型并做任何你想做的事情。然而,这是相当先进的,需要对现有的翻译人员进行一些研究。我们可以在Google Group上为您提供帮助;stackoverflow 可能不是这个讨论的正确位置。

于 2012-09-25T16:57:09.230 回答