我正在尝试将这三个对象合并为一个复杂的对象:
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,它可以正常工作,但它的代码要多得多,而且非常难看。我真的希望这种方法能够奏效,答案就在我面前,但我就是看不到。任何帮助将不胜感激。