Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “字段名”;“类名”;正在由morphia插入mongodb_Java_Mongodb_Morphia - Fatal编程技术网

Java “字段名”;“类名”;正在由morphia插入mongodb

Java “字段名”;“类名”;正在由morphia插入mongodb,java,mongodb,morphia,Java,Mongodb,Morphia,我对mongodb和morphia非常陌生,在开始使用它之后,我意识到mongodb文档中还有一个额外的部分,记录包含一个文件名“ClassName”,其中包含morphia映射的类的值 { "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"} 这正常吗?我觉得这侵犯了数据库中数据的完整性,是否有任何方法可以绕过它?这是正常的。由于M

我对mongodb和morphia非常陌生,在开始使用它之后,我意识到mongodb文档中还有一个额外的部分,记录包含一个文件名“ClassName”,其中包含morphia映射的类的值

{ "_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是否会根据数据字段进行区分,但它似乎没有这样做。