2012-09-25 56 views
0

說我已經取得Objectify4與我的項目工作(雖然我仍然在做它的工作的工作),纔有可能堅持實體與這樣的地圖領域:應堅持地圖與Objectify4

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?或App引擎?

回答

1

這將作爲-是Objectify4,與一對夫婦的注意事項:

  1. 不能使用「」密鑰名稱中的字符
  2. Object的值根本不會被翻譯;它將會是數據存儲接受的任何東西。

1是因爲這最終被存儲在原始實體中作爲field.keyname(可能有幾層'。'分隔嵌入字段)。

2是因爲你正在刪除任何類型的信息,因此Objectify只是把對象當作對象。這就像你直接使用低級API;您只能存儲基元或基元集合。沒有數組,當然沒有地圖。收藏始終作爲List返回。無論存儲的尺寸是多少,數字總是會回到Long。還有一些其他古怪的行爲。

如果你真的想要這樣的行爲,你可以創建一個自定義的TranslatorFactory,它將在運行時反省類型,並做你想做的任何事情。然而,這是相當先進的,並且需要對現有譯員進行一些研究。我們可以幫你解決Google Group; stackoverflow可能不是這個討論的正確位置。