2012-01-26 13 views
2

私は、単一の複雑なオブジェクトにこれらの3つのオブジェクトをマージしようとしているため、複雑なオブジェクトに複数のオブジェクトをマージする問題:Morphia

public class Person { 
    private String name; 
    private List<Event> events; 

    // getters and setters 
} 
public class Event { 
    private String name; 
    private List<Gift> gifts; 

    // getters and setters 
} 
public class Gift { 
    private String name; 
    private String recipient;// the name of the person 
    private String eventName; 

    // getters and setters 
} 

私の目標は、Morphiaを使用してMongoDBの中でPersonオブジェクトを保存することであり、この方法私は自分の文書をレイアウトしたい。私は、各オブジェクトのリストを組み合わせたドキュメントビルダを作成しました。各人物はすべてのイベントのリストを取得しますが、特定のギフトだけを受け取ることができます。私の文書作成者はMorphiaが保持できる文書を作成しますが、その最後の受信者(並べ替え順)のギフトだけがすべての人物のイベントに挿入されます。正しいイベントのためですが。私は外側のループを削除し、この方法は、人の特定のインデックスの引数を取ることによって一度に1人を処理するために少しのコードを変更する場合

public void merge() { 
    for (Person person : listOfPersons) { 
     for (Event event : listOfEvents) { 
     // somePersonsGifts: a sublist of gifts based on Event and Person. 
     List<Gift> somePersonsGifts = new ArrayList<Gift>();    
     for (Gift gift : listOfGifts) { 
      if (person.getName().equals(gift.getRecipient()) && gift.getEventName().equals(event.getName())) { 
        somePersonsGifts.add(gift); 
      } 
     } 
     event.setGifts(somePersonsGifts); 
     } 
     person.setEvents(listOfEvents) 
    } 
} 

リスト:

public void merge(int p) { 
    Person person = listOfPersons.get(p); 
    //...and so on 

は、私は1つを取得します正しい贈り物でPersonオブジェクトを完成させる。この修正されたバージョンをループにフィードしようとすると、問題が戻ってきます。私は定期的なfor-loopsと同期したコレクションを使ってみました。私はGoogle GuavaのImmutableArrayListを使ってみましたが、まだ運がありません。私は、問題にアクセスしている間にリストを変更しているが、その周りには何も見つかりませんでした。私はMongoDBドライバを直接使用するDAOを作成しましたが、正しく動作しますが、コードはかなり多く、かなり醜いです。私は本当にこのアプローチを働かせたい、答えは私の前にあるが、私はそれを見ることができない。どんな助けでも大歓迎です。ここで

+0

あなたはあなたの問題が何であるかを特定していませんでした。 –

+0

同じリストを再利用しようとしましたが、問題は解決しません。私は十分に明確ではないことをお詫びします。私はすべての人にすべてのギフトを追加したくないので、私は最も内側のループに条件付きがあるのです。特定の名前と特定のイベントに一致するギフトを追加したいと思います。この現象は、現在のsomePersonGiftsリストをイベントに追加するときにそれを参照するのにコピーしていないという事実から来ていると強く信じています。そのため、somePersonGiftsリストの最後の値はすべてのコピーに保持されています。私のために努力してくれた皆様に感謝します。 –

答えて

1

はあなたの問題です:

List<Gift> somePersonsGifts = new ArrayList<Gift>();    
.... 
event.setGifts(somePersonsGifts); 

あなたは一人だけのための贈り物を追加します。すべてのギフトをイベントに集約したい場合は、既存のリストを再利用してください。

0

私はMongoDBやMorphiaについて何も知らないが、問題はsetter event.setGifts(somePersonsGifts)person.setEvents(events)の使用だと思う。あなたのコードは、既存のギフトとイベントのリストをループ内でさらに計算しているものとマージしているようには見えません。 あなたは空の新しいもので上書きするのではなく、既に存在するギフトリスト(およびイベントリストも)を取り出すべきです。

0

方法マージは、()リスト内にあるが、私はあなたがここに

person.setEvents(events); 

リストイベントを使用しているので、たぶん、あなたがいることを

person.setEvents(listOfEvents) 

お知らせを意味することを前提とした場合、私は知りませんすべてのイベントを各人物に追加しています。すべての人がすべてのイベントに出席した場合は、そのイベントを人の中に入れる必要はありません。