我对mongodb和morphia很新,在开始使用它之后,我意识到mongodb文档中有一个额外的部分,该记录包含一个文件名“ClassName”,其值为morphia映射的类。
{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"}
这是正常的吗?我觉得它违反了数据库中数据的完整性,无论如何都可以绕过它?
答案 0 :(得分:19)
您可以明确禁用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
答案 1 :(得分:1)
这很正常。由于Morphia支持多态,因此子类应存储在持久保存超类的同一集合中。为了在查询和存储时区分/过滤,它使用此字段。希望你也可以使用Morphia进行查询。您如何看待它会影响数据的完整性,因为您可以轻松过滤掉它。
Hibernate也有,用于支持多态的鉴别列。