Я пытаюсь объединить эти три объекта в один сложный объект:
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 и синхронизированные коллекции.Я пытался использовать Google Guava ImmutableArrayList и до сих пор не повезло.Я знаю, что проблема в том, что я изменяю списки при доступе к ним, но я не могу найти вокруг них ничего.Я написал DAO, который использует драйвер MongoDB напрямую, и он работает правильно, но это гораздо больше кода и довольно некрасиво.Я действительно хочу, чтобы этот подход работал, ответ передо мной, но я просто не вижу его.Любая помощь будет принята с благодарностью.