2016-05-11 21 views
1

...Morphia投影動作

Student.class(省略方法)

@Entity(value = "students", noClassnameStored = true) 
public class Student 
{ 
    @Id 
    private String id = new ObjectId().toString(); 
    private String name; 
    private String city = "London"; // Default Value 
} 

NOTEをその方法Morphiaが設計されている場合、私はわからないが、ここでは行きます:DEFAULT値をに割り当てました。インスタンス変数cityです。今出力 今のコード...

Student s1 = new Student("James Bond"); // London IS his default city 
    ds.save(s1); 

    Student s2 = new Student("Jason Bourne"); 
    s2.setCity("New York");     // Set a city for Mr. Bourne 
    ds.save(s2); 

    System.out.println("----- Normal -----"); 
    List<Student> studentsNormal = ds.createQuery(Student.class).asList(); 
    for(Student s: studentsNormal) 
     System.out.println(s); 

    System.out.println("----- Projected -----"); 
    Query<Student> query = ds.find(Student.class); 
    query.retrievedFields(false, "city"); 

    List<Student> studentsProjected = query.asList(); 
    for(Student s: studentsProjected) 
     System.out.println(s); 

そして、...

----- Normal ----- Student{id='57337553db4f0f0f10a93941', name='James Bond', city='London'} Student{id='57337553db4f0f0f10a93942', name='Jason Bourne', city='New York'} ----- Projected ----- Student{id='57337553db4f0f0f10a93941', name='James Bond', city='London'} Student{id='57337553db4f0f0f10a93942', name='Jason Bourne', city='London'}

さて、Morphiaの行動について4つの質問...

Q1。ボンド氏の場合、私はcityを変更せず、cityを投影リストから除外しましたが、cityのデフォルト値はLondonと表示されます。これはnullではないはずですか?

Q2。ボーン氏の場合、cityNew Yorkに変更しましたが、投影中もデフォルト値が選択され、Londonと表示されました。これもnullではないでしょうか?

は、私はまだMorphiaからProjection.classを(そう今夜するつもり)見たhaventが、除外ため、Morphiaは、デフォルト値を拾うように思われないオーバー乗りnullとしないようです。私はインスタンス変数にデフォルト値を提供する方法がないので、これは妨げになります...

Q3。これはMorphiaかMongoD Java Driverの動作/問題ですか?

最後の質問...

Q4。これに関する既知の回避策はありますか?

私の周りGoogleで検索しているが、任意のソリューションや、これまでの説明を周りに来ていない...事前に

おかげで...

SG

答えて

1

Morphiaは、クエリからドキュメントを読んでいます結果、最初に行うことは、エンティティの新しいインスタンス、Studentを作成することです。これはno引数のコンストラクタを呼び出すだけです。魔法は必要ありません。都市フィールドは値で初期化されます。これが完了すると、Morphiaはデータベースから返されたドキュメントの各キーを取得し、マップされたフィールドを見つけて設定します。あなたのケースでは、ドキュメントに市のキーがないので、そのフィールドは初期化された値をそのまま残してMorphiaによって設定されることはありません。

一般に、このようなエンティティのフィールドを初期化するのは悪い習慣です。データベースからロードされたすべてのエンティティに対して、JVMはこれらのフィールドを後で上書きするためにいくつかの値に初期化する必要があります。クエリ結果に特定のフィールドが戻らないような場合、Morphiaが新しいインスタンスをアプリケーションに返すと、それらの値は残ります。

+0

私はJDK 1.1からJavaになっています。この「悪い習慣」は、Morphiaの観点からのものかもしれませんが、Javaによるものではありません。私の質問は、投影の意図されたデザインに関するものです。それ以外に、これを達成するための回避策はありますか? – SSG

+0

一般的に、永続ライブラリは悪いことです。私は冬眠は同様の問題があると思います。とにかく、Morphiaでこれを解決する方法は、単純に初期化子を持たないことです。デフォルトの何らかの並べ替えとしてその値が必要な場合は、ある種のファクトリメソッドを検討してください。 – evanchooly

+0

コード内の他の場所でエラーを回避するために、ランタイム割り当てを使用して初期化を削除しました...!それがどのように動作するかの概要を提供しているので、答えをマークしてください....! – SSG