2014-02-11 221 views
6

我在RDBMS世界和MongoDB的神祕海洋中進行了一些探索。我使用Spring Data來幫助我進行冒險。我需要在兩個集合來創建文檔之間的手動參考(我讀過DBREFS是昂貴的),我的POJO是這樣的:將ObjectId字段映射到字符串

public class User { 
    @Id 
    private String id; 
    private String name; 
    private String password; 
    ... 
} 



public class Game { 
    @Id 
    private String id; 
    private String name; 
    private String platform; 
    private String userID; 
    ... 
} 

的用戶ID是現有用戶的ID,它的存儲數據庫中的ObjectId。當我檢索一個遊戲文檔時,userID字段被正確映射到一個String值,但是我希望spring-data在持久化(String到ObjectId)時執行逆映射,並且我不知道如何去做。

有人可以用這個指出我的方向嗎? 我應該放棄這種方式,並將簡單的解決方案直接存儲爲字符串嗎?

非常感謝!

+0

是否有可能自動獲取用戶信息匹配userId時你從數據庫中列出遊戲pojo還是需要額外的映射代碼?請幫忙。 –

回答

5

默認情況下,當使用spring-data-mongodb時,Spring使用MappingMongoConverter將域對象轉換爲|來自文件。

的ID屬性的默認轉換政策如下:

下面簡單介紹一下什麼字段將被映射到「_id」文檔字段:

與@Id(ORG註釋字段。 springframework.data.annotation.Id)將被映射到'_id'字段。 沒有註釋但名爲id的字段將被映射到'_id'字段。 下面概述了映射到_id文檔字段的屬性將進行的類型轉換(如果有)。

如果在Java類中將名爲'id'的字段聲明爲String或BigInteger,則它將轉換爲並存儲爲ObjectId(如果可能)。 ObjectId作爲字段類型也是有效的。

此轉換不是默認完成的任何其他標準屬性。所以,如果你想userID字段保存爲ObjectId簡單地改變字段類型:private ObjectId userID;

這並不是說oposite情況是,如果你想的Userid財產保存爲字符串在MongoDB中不太簡單,你將不得不提供您自己的映射轉換器覆蓋writeInternal方法(通過它的名稱,它意味着你不應該)或覆蓋其他一些Spring MongoDB管道bean進一步下降轉換過程

+0

非常感謝,orid,你的解釋對我來說真的很明確,它確實有幫助。我會遵照你的建議。 – CescGarcia

+0

@Ori Dar,我們有具有「id」屬性的域類,但它沒有註釋。當我檢查mongo db文檔時,id和_id具有不同的值,但是當我通過spring數據檢索數據時,id屬性的值設置爲_id。我該如何獲得mongo中的id的實際價值?注意:我們的系統在這裏沒有將數據插入到數據庫中。 –

+0

@NaveenChappa基本上你可以嘗試'@Id String _id;'和'@Field(「id」)String id;'但是因爲這是一個單獨的問題,所以請張貼它,包括你的文檔樣本和分類 –