2

これらの 3 つのオブジェクトを 1 つの複雑なオブジェクトにマージしようとしています。

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 が保存できるドキュメントを作成しますが、最後の受信者 (並べ替え順) のギフトのみがすべての人物のイベントに挿入されます。ただし、正しいイベントの場合。

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)
   }
}

外側のループを削除し、メソッドが Persons リストの特定のインデックスの引数を取るようにすることで、一度に 1 人ずつ処理するようにコードを少し変更すると、次のようになります。

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

正しいギフトを含む 1 つの完全な Person オブジェクトを取得します。この変更されたバージョンをループに入れようとすると、問題が再発します。通常の for ループと同期コレクションを使用してみました。Google Guava の ImmutableArrayList を使用してみましたが、まだうまくいきません。問題は、アクセス中にリストを変更していることですが、とにかくそれを見つけることができません。MongoDB ドライバーを直接使用する DAO を作成したところ、適切に動作しましたが、コードが多くなり、見栄えが悪くなります。私は本当にこのアプローチが機能することを望んでいます.答えは私の目の前にありますが、私はそれを見ることができません. どんな助けでも大歓迎です。

4

3 に答える 3

1

これがあなたの問題です:

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

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

于 2012-01-26T14:00:30.060 に答える
0

メソッドmerge()がリスト内にあるかどうかはわかりませんが、ここでリストイベントを使用しているので、

person.setEvents(events);

多分あなたは意味しました

person.setEvents(listOfEvents)

すべてのイベントを各人に追加していることに注意してください。すべての人がすべてのイベントに参加した場合、その人の中にイベントを置く必要はありません。

于 2012-01-26T14:34:12.117 に答える
0

MongoDB や Morphia については何も知りませんが、セッターevent.setGifts(somePersonsGifts)person.setEvents(events). あなたのコードは、既存のギフトとイベントのリストを、ループでさらに計算しているものとマージしていないようです。空の新しいギフト リストで上書きするのではなく、既存のギフト リスト (およびイベント リストも) を取得する必要があります。

于 2012-01-26T14:01:28.530 に答える