2012-01-09 29 views
9

我想不同的數據存儲到一個集合中的MongoDB,並與相應的字段數據春豆..春MongoDB的數據類繼承

對不起,我跳過的細節。

父bean:

class A 
    int a 

柴爾茲:

class B extends A 
    double b 

class C extends A 
    String c 

因此,有以下的蒙戈

{a : 1, b : 2.3, c : "Test"} 

當我獲取數據,這是確定的文件。但是,當我打電話從CrudRepository對於B 保存方法,它重寫所有數據和我失去了C.

我只知道一個很好的選擇,創建自定義的保存方法與增量更新,如

update.set("b", newvalue)... 

但有反思。

您有任何其他想法嗎?

在此先感謝。

+1

您是否介意在與'MongoTemplate'和您的存儲庫的交互中稍微詳細一點?你是否將數據讀回到'B'的對象中?實際上應該返回一個類型爲「C」的對象,因爲我們應該檢測存儲的類型信息。除此之外,集合映射信息將會有所幫助。確保所有類都映射到相同的集合。 – 2012-01-10 08:16:22

+0

嗨奧利弗,謝謝你的回答。是的,我已經覆蓋'MongoTemplate'的'save'方法來使用更新查詢。現在當我保存'B'時,它只更新'B'字段。但我試圖找到更多真棒解決方案... – 2012-01-10 20:14:30

+0

如果您添加相關的代碼片段,我們可能會深入探討這個問題:) – 2012-01-11 08:24:36

回答

5

對於Spring-data MongoTemplate,除了對象中的字段外,還會保存一個 附加字段名_class,它告訴模板它將保存哪個類。
使用其他對象的存儲庫而不管的繼承關係,您將無法正確保存對象。

Spring的CrudRepository基本上是Generic Dao模式。由於所有的dao都實現了這個接口,並且有了save方法,所以你可以通過知道使用哪個dao來保存任何對象。

爲此,您可以創建一個用於初始化存儲庫的RepositoryFactory,該存儲庫提供一個getRepository(Class類型)函數,爲您提供適當的存儲庫以供您的類使用。然後,你就可以這樣做:

repositoryFactory.getRepository(myType.getClass()).save(myType); 

您可以在這裏找到更多的細節:http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

如果你想存儲相同的集合中的所有對象,你可以使用註解@Document(集合= 「MyCollection的」)。如果您未給出集合名稱,則默認情況下將根據類名稱將每個類保存在單獨的集合中。