11

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

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

这是正常的吗?我觉得它违反了数据库中数据的完整性,有没有办法绕过它?

4

2 回答 2

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

于 2013-07-18T11:55:21.617 回答
1

这个是正常的。由于 Morphia 支持多态性,意味着子类应存储在与超类相同的集合中。为了在查询和存储时进行区分/过滤,它使用该字段。希望您也可以使用 Morphia 进行查询。您如何看待,它会影响数据的完整性,因为您可以轻松将其过滤掉。

Hibernate 也有支持多态性的鉴别器列。

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

于 2013-07-18T09:16:01.493 回答