Я пытаюсь объединить эти три объекта в один сложный объект:Проблемы объединения нескольких объектов в сложный объект для морфия
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 используя морфий, и это как Я хочу, чтобы мой документ был выложен. Я создал создатель документа, который объединяет списки каждого объекта. Каждый человек получает список всех событий, но может получать только определенные подарки. В то время как мой создатель документа создает документ, который может сохраняться Морфией, в «События для всех лиц» вставляются только Дары последнего получателя (порядок сортировки). Хотя для правильных событий.
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-loops и синхронизированные коллекции. Я пробовал использовать ImmutableArrayList от Google Guava и до сих пор не повезло. Я знаю, что проблема заключается в том, что я меняю списки при доступе к ним, но я не могу найти их вокруг. Я написал DAO, который напрямую использует драйвер MongoDB, и он работает правильно, но это намного больше кода и довольно уродливый. Я действительно хочу, чтобы этот подход работал, ответ передо мной, но я просто не вижу его. Любая помощь будет принята с благодарностью.
Вы не указали, в чем проблема, вы просто намекаете на это. –
Я попытался использовать один и тот же список, но проблема не исчезнет. Прошу прощения за то, что я недостаточно ясен. Я не хочу добавлять все Подарки ко всем Лицам, поэтому у меня есть условие на внутреннюю петлю. Я хочу добавить подарки, соответствующие конкретному имени и конкретному событию. Я твердо верю, что поведение происходит из-за того, что я не копирую текущий список somePersonGifts, когда добавляю его к событию, но ссылаюсь на него, поэтому последние значения в списке somePersonGifts являются значениями, хранящимися во всех копиях. Спасибо всем за их усилия от моего имени. –