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
}

我的目标是使用 Morphia 将 Person 对象保存在 MongoDB 中,这也是我希望文档布局的方式。我已经创建了一个文档构建器,它结合了每个对象的列表。每个人都会得到一份所有事件的列表,但只能接收特定的礼物。虽然我的文档构建器确实创建了 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)
   }
}

如果我通过删除外部循环并让该方法为 Persons 列表的特定索引获取参数来稍微修改代码以一次处理一个人:

public void merge(int p) {
   Person person = listOfPersons.get(p);
   //...and so on

我得到一个带有正确礼物的完整 Person 对象。如果尝试将此修改后的版本输入循环,则问题又回来了。我尝试过使用常规的 for 循环和同步集合。我已经尝试使用 Google Guava 的 ImmutableArrayList 并且仍然没有运气。我知道问题是我在访问列表时正在更改列表,但无论如何我都找不到它。我写了一个直接使用 MongoDB 驱动程序的 DAO,它可以正常工作,但它的代码要多得多,而且非常难看。我真的希望这种方法能够奏效,答案就在我面前,但我就是看不到。任何帮助将不胜感激。

4

3 回答 3

1

这是你的问题:

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

您只为一个人添加礼物;如果您想将所有礼物汇总到活动中,请重新使用现有列表。

于 2012-01-26T14:00:30.060 回答
0

我不知道方法 merge() 是否在列表中,但我假设因为您在这里使用列表事件

person.setEvents(events);

也许你的意思是

person.setEvents(listOfEvents)

请注意,您正在将所有事件添加到每个人。如果所有的人都参加了所有的事件,那么事件就没有必要存在于人体内。

于 2012-01-26T14:34:12.117 回答
0

我对 MongoDB 或 Morphia 一无所知,但我怀疑问题在于您使用了 setterevent.setGifts(somePersonsGifts)person.setEvents(events). 您的代码似乎没有将现有的礼物和事件列表与您在循环中进一步计算的列表合并,这就是您希望它的行为方式(如果我正确理解了这个问题)。您应该检索已经存在的礼物列表(以及事件列表),而不是用空的新礼物列表覆盖它们。

于 2012-01-26T14:01:28.530 回答