Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多个对象合并为Morphia的复杂对象时出现问题_Java_Collections_Concurrency_Morphia - Fatal编程技术网

Java 将多个对象合并为Morphia的复杂对象时出现问题

Java 将多个对象合并为Morphia的复杂对象时出现问题,java,collections,concurrency,morphia,Java,Collections,Concurrency,Morphia,我试图将这三个对象合并为一个复杂对象: 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 cl

我试图将这三个对象合并为一个复杂对象:

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
}
我得到了一个完整的人与正确的礼物对象。如果试图将这个修改过的版本反馈到一个循环中,问题又会出现。我尝试过使用常规for循环和同步集合。我试过使用Google Guava的ImmutableArrayList,但仍然没有成功。我知道问题是,我在访问列表时更改了列表,但我找不到相关的列表。我编写了一个直接使用MongoDB驱动程序的DAO,它可以正常工作,但代码要多得多,而且相当难看。我真的希望这种方法能奏效,答案就在我面前,但我就是看不到。任何帮助都将不胜感激。

这是您的问题:

List<Gift> somePersonsGifts = new ArrayList<Gift>();               
....
event.setGifts(somePersonsGifts);
列出somePersonsGifts=newArrayList();
....
事件。设置礼物(某些人的礼物);

您只为一个人添加礼物;如果要将所有礼物聚合到事件中,请重新使用现有列表。

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

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

person.setEvents(events);
也许你是说

person.setEvents(listOfEvents)

请注意,您正在向每个人添加所有事件。如果所有的人都参加了所有的活动,那么就没有必要将活动放在人的内部。

您没有指定问题是什么,只是暗示了一下。我已经尝试重复使用相同的列表,但问题没有消失。我很抱歉说得不够清楚。我不想把所有的礼物都加在所有的人身上,这就是为什么我有最内部循环的条件。我想添加与特定名称和特定事件匹配的礼物。我坚信,这种行为来自于这样一个事实:当我将当前somePersonGifts列表添加到事件中时,我并没有复制它,而是对它的引用,因此somePersonGifts列表中的最后一个值是所有副本中保存的值。感谢大家为我所做的努力。
person.setEvents(events);
person.setEvents(listOfEvents)