Я пытаюсь объединить эти три объекта в один сложный объект:
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
}
Моя цель - сохранить объект Person в MongoDB с помощью Morphia, и именно так я хочу, чтобы мой документ был выложен. Я создал своего рода конструктор документов, который объединяет списки каждого объекта. Каждый Человек получает список всех Событий, но может получать только определенные Подарки. Хотя мой построитель документов создает документ, который 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)
}
}
Если я немного изменю код, чтобы обрабатывать одного человека за раз, удалив внешний цикл и заставив метод принимать аргумент для определенного индекса списка людей:
public void merge(int p) {
Person person = listOfPersons.get(p);
//...and so on
Я получаю один полный объект Person с правильными подарками. Если попытаться загрузить эту измененную версию в цикл, проблема вернется. Я пытался использовать обычные циклы for и синхронизированные коллекции. Я пытался использовать ImmutableArrayList от Google Guava, и все равно не повезло. Я знаю, что проблема в том, что я меняю списки при доступе к ним, но я все равно не могу их найти. Я написал DAO, который использует драйвер MongoDB напрямую, и он работает правильно, но это намного больше кода и довольно уродливо. Я действительно хочу, чтобы этот подход работал, ответ передо мной, но я просто не вижу его. Любая помощь будет принята с благодарностью.