2012-01-26 1 views
2

Я пытаюсь объединить эти три объекта в один сложный объект:Проблемы объединения нескольких объектов в сложный объект для морфия

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

+0

Вы не указали, в чем проблема, вы просто намекаете на это. –

+0

Я попытался использовать один и тот же список, но проблема не исчезнет. Прошу прощения за то, что я недостаточно ясен. Я не хочу добавлять все Подарки ко всем Лицам, поэтому у меня есть условие на внутреннюю петлю. Я хочу добавить подарки, соответствующие конкретному имени и конкретному событию. Я твердо верю, что поведение происходит из-за того, что я не копирую текущий список somePersonGifts, когда добавляю его к событию, но ссылаюсь на него, поэтому последние значения в списке somePersonGifts являются значениями, хранящимися во всех копиях. Спасибо всем за их усилия от моего имени. –

ответ

1

Вот ваша проблема:

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

Вы добавляете подарки только для одного человека; если вы хотите объединить все подарки в мероприятие, повторите использование существующего списка.

0

Я ничего не знаю о MongoDB или Morphia, но я подозреваю, что проблема заключается в использовании сеттеров event.setGifts(somePersonsGifts) и person.setEvents(events). Ваш код, похоже, не объединяет существующие списки подарков и событий с теми, которые вы вычисляете далее в цикле, как вы хотите, чтобы он вел себя (если я правильно понял вопрос). Вы должны получить уже существующий список подарков (и список событий) вместо того, чтобы перезаписать их пустыми новыми.

0

Я не знаю, если метод слияния() находится в списке, но я предполагаю, что, поскольку вы используете список событий здесь

person.setEvents(events); 

Может быть, вы имели в виду

person.setEvents(listOfEvents) 

Обратите внимание, что вы добавляете все события каждому человеку. Если все люди пошли на все события, нет необходимости иметь события внутри человека.

 Смежные вопросы

  • Нет связанных вопросов^_^