これらの 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 を作成したところ、適切に動作しましたが、コードが多くなり、見栄えが悪くなります。私は本当にこのアプローチが機能することを望んでいます.答えは私の目の前にありますが、私はそれを見ることができません. どんな助けでも大歓迎です。