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

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

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

这是正常的吗? 我觉得它违反了数据库中数据的完整性,无论如何都要绕过它吗?

您可以显式禁用className属性: @Entity(noClassnameStored = true)

如果只有一个实体类,我通常会抑制该属性。 如果我是我的实体的子类,我明确地启用它(这是默认的,但只是为了确定)。

如果我没有弄错的话,即使没有className (基于reflection),Morphia也足够聪明地根据属性猜测正确的子类。 因此,如果您的子类Developer of Person中有一个属性mongoKnowledge ,而您的子类Manager没有它,Morphia将知道mongoKnowledge的文档必须属于Developer类。 严格来说,只有当您的子类具有相同的属性时才需要className ; 但是,我不会太依赖它。

我没有尝试重命名实体类,但它可能会导致问题。 提供@Polimorphic注释并将其与之一起修复是一个长期存在的问题。 请参阅https://code.google.com/p/morphia/issues/detail?id=22

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

Hibernate也有,用于支持多态的鉴别器列。

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