morphia将字段名“ClassName”插入到mongodb中

时间:2013-07-18 09:01:45

标签: java mongodb morphia

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

{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"}
这是正常的吗?我觉得它违反了数据库中数据的完整性,无论如何都可以绕过它?

2 个答案:

答案 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也有,用于支持多态的鉴别列。

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