Проблемы слияния нескольких объектов в сложный объект для Morphia - PullRequest
2 голосов
/ 26 января 2012

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

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

Ответы [ 3 ]

1 голос
/ 26 января 2012

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

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

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

0 голосов
/ 26 января 2012

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

person.setEvents(events);

Возможно, вы имели в виду

person.setEvents(listOfEvents)

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

0 голосов
/ 26 января 2012

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

...