2013-07-18 73 views
11

我對mongodb和morphia很陌生,開始使用它之後,我意識到在mongodb文檔中有一個額外的部分,該記錄包含一個提交的名稱「 ClassName「與morphia映射的類的值。字段名稱「ClassName」被morphia插入到mongodb中

{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"} 

這是正常的嗎?我覺得它違反了數據庫中數據的完整性,有沒有辦法繞過它?

回答

18

可以明確禁用className屬性:@Entity(noClassnameStored = true)

我通常抑制屬性,如果有一個單一的實體類。如果我繼承我的實體,我明確地啓用它(這是默認的,但只是可以肯定)。

如果我沒有弄錯,Morphia很聰明,根據屬性猜測正確的子類,即使沒有className(基於反射)。所以,如果你在你的子類開發和子類經理沒有它有一個屬性mongoKnowledge,嗎啡會知道,與mongoKnowledge文件必須是類開發的。所以嚴格來說className只有在您的子類具有相同的屬性時纔是必需的;但是,我不會太依賴它。

我還沒有嘗試重命名實體類,但它可能會導致問題。提供@Polimorphic註釋並解決它一直存在長期存在的問題。請參閱https://code.google.com/p/morphia/issues/detail?id=22

1

這是正常的。由於Morphia支持多態性,所以意味着子類必須存儲在保持超類的同一個集合中。爲了在查詢和存儲時區分/過濾,它使用此字段。希望你也可以使用Morphia進行查詢。您如何看待,這會影響數據的完整性,因爲您可以輕鬆地將其過濾掉。

Hibernate也有支持多態的鑑別器列。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-discriminator

+0

如果稍後我更改類的名稱,會發生什麼?名稱重構經常發生,我是否必須遍歷所有記錄並全部更新它們? – nightograph

+0

是的,你必須 – Faliorn