Java “字段名”;“类名”;正在由morphia插入mongodb
我对mongodb和morphia非常陌生,在开始使用它之后,我意识到mongodb文档中还有一个额外的部分,记录包含一个文件名“ClassName”,其中包含morphia映射的类的值Java “字段名”;“类名”;正在由morphia插入mongodb,java,mongodb,morphia,Java,Mongodb,Morphia,我对mongodb和morphia非常陌生,在开始使用它之后,我意识到mongodb文档中还有一个额外的部分,记录包含一个文件名“ClassName”,其中包含morphia映射的类的值 { "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"} 这正常吗?我觉得这侵犯了数据库中数据的完整性,是否有任何方法可以绕过它?这是正常的。由于M
{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"}
这正常吗?我觉得这侵犯了数据库中数据的完整性,是否有任何方法可以绕过它?这是正常的。由于Morphia支持多态性,这意味着子类应存储在保存超类的同一集合中。为了在查询和存储时区分/过滤,它使用此字段。希望您也可以使用Morphia进行查询。您认为它会如何影响数据的完整性,因为您可以轻松地将其过滤掉 Hibernate也有用于支持多态性的鉴别器列
您可以显式禁用
className
属性:@实体(noClassnameStored=true)
如果只有一个实体类,我通常会抑制该属性。如果我正在子类化我的实体,我将显式地启用它(这是默认设置,但只是为了确定)
如果我没有弄错的话,Morphia足够聪明,可以根据属性猜测正确的子类,即使没有类名
(基于反射)。因此,如果您在Person的子类Developer中有一个属性mongoKnowledge,而您的子类管理器没有该属性,Morphia将知道带有mongoKnowledge的文档必须属于类Developer。因此严格地说,className
仅在子类具有相同属性时才是必需的;然而,我不会太依赖它
我没有尝试重命名实体类,但这可能会导致问题。提供
@Polimorphic
注释并将其与之一起修复是一个长期存在的问题。请参见如果以后我更改了类的名称,会发生什么情况??名称重构经常发生,我必须检查所有记录并更新它们吗?我运行了一个简单的测试,看看Morphia是否会根据数据字段进行区分,但它似乎没有这样做。