我对 mongodb 和 morphia 很陌生,开始使用它后,我意识到 mongodb 文档中有一个额外的部分,记录包含一个文件名“ClassName”,其中包含 morphia 映射的类的值。
{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"}
这是正常的吗?我觉得它违反了数据库中数据的完整性,有没有办法绕过它?
您可以显式禁用该className
属性:@Entity(noClassnameStored = true)
如果有一个实体类,我通常会抑制属性。如果我对我的实体进行子类化,我会明确启用它(这是默认设置,但只是为了确定)。
如果我没记错的话,即使没有className
(基于反射),Morphia 也足够聪明,可以根据属性猜测正确的子类。因此,如果您在Person的子类Developer中有属性mongoKnowledge而您的子类Manager没有它,Morphia 将知道具有mongoKnowledge的文档必须属于Developer类。所以严格来说,只有当您的子类具有相同的属性时才需要;但是,我不会过分依赖它。className
我没有尝试重命名实体类,但它可能会导致问题。@Polimorphic
提供注释并与之一起修复是一个长期存在的问题。见https://code.google.com/p/morphia/issues/detail?id=22
这个是正常的。由于 Morphia 支持多态性,意味着子类应存储在与超类相同的集合中。为了在查询和存储时进行区分/过滤,它使用该字段。希望您也可以使用 Morphia 进行查询。您如何看待,它会影响数据的完整性,因为您可以轻松将其过滤掉。
Hibernate 也有支持多态性的鉴别器列。