2013-07-18 10 views
11

mongodbとmorphiaにはかなり新しく、使用を開始した後、mongodbドキュメントに余分な部分があることを認識しました。 ClassName "にマッピングされたクラスの値を返します。フィールド名 "ClassName"がmongodbにmorphiaによって挿入されています

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

これは正常ですか?私はそれがdbのデータの整合性に違反していると感じる、それを回避するためにとにかくありますか?

答えて

18

明示的className属性を無効にすることができます。私のエンティティをサブクラス化する場合、明示的に有効にしています(デフォルトですが、確かにそうです)。

私が誤解していない場合、Morphiaは、className(反射に基づく)がなくても、プロパティに基づいて正しいサブクラスを推測するのに十分なほど精巧です。あなたのサブクラスでmongoKnowledge属性を持っている場合の開発とサブクラスマネージャーがそれを持っていないので、Morphiaはと文書mongoKnowledgeはクラス開発のものでなければならないことを知っています。したがって、厳密にはclassNameと言います。サブクラスが同じ属性を持つ場合にのみ必要です。しかし、私はあまりそれに頼らないだろう。

エンティティクラスの名前を変更しようとはしませんでしたが、問題が発生する可能性があります。 @Polimorphicアノテーションを提供し、それを一緒に修正することは長年にわたり問題です。 https://code.google.com/p/morphia/issues/detail?id=22

1

これは正常です。 Morphiaは多態性をサポートしているので、スーパークラスが保持されている同じコレクションにサブクラスを格納しなければなりません。照会と保存中に差別化/フィルタリングするために、このフィールドが使用されます。 Morphiaをクエリに使用したいと考えています。データを簡単にフィルタリングできるので、データの整合性にどのように影響すると思いますか。

もHibernateには、多型をサポートするための弁別子列があります。単一のエンティティクラスが存在する場合、@Entity(noClassnameStored = true)

私は、一般的に属性を抑えています:

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

+0

後でクラスの名前を変更するとどうなりますか?名前のリファクタリングはかなり頻繁に起こりますが、すべてのレコードを調べてそれらをすべて更新する必要がありますか? – nightograph

+0

はい、あなたはする必要があります – Faliorn

関連する問題