作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在此应用程序中使用 Spring MVC + Hibernate + JPA
。我需要做的是,更新 一个与@manyToMany
关系相关的实体(用户)与另一个实体(任务)。这是我的代码,
User user = baseRequest.getUser();
if (user.getTasks() != null && user.getTasks().size() > 0) {
// Get logged user by userId
User loggedUser = em.find(User.class, user.getUserId());
//Get existing tasks for loggedUser
List<Task> existingTasks = loggedUser.getTasks();
//Get new tasks for user by request
List<Task> tasks = user.getTasks();
for (Task t : tasks) {
// Look up new tasks by taskId
task = em.find(Task.class, t.getTaskId());
if (task != null) {
if(!existingTasks.contains(task)){
existingTasks.add(task);
}
}else{
throw new SfaCustomException(String.format("taskId is required"));
}
}
user.setTasks(existingTasks);
}
entityManager.merge(user);
entityManager.flush();
entityManager.refresh(user);
在这里,我需要向用户 添加新的任务。但是当我运行这个请求时,我得到了 java.util.ConcurrentModificationException
我尝试使用 Iterator 而不是使用 for-each 循环。但同样的结果。以另一种方式,我尝试使用单独的列表来添加旧任务和新任务,而不是使用与上面相同的列表。但是当我调用 entityManager.merge(user);
时,它会删除现有任务并重新添加新旧任务。我需要做什么来避免出现此异常?
非常感谢您的帮助,因为我是 jpa
的新手。
最佳答案
尝试改变这个:
//Get existing tasks for loggedUser
List<Task> existingTasks = loggedUser.getTasks();
为此:
//Get existing tasks for loggedUser
List<Task> existingTasks = new ArrayList<>(loggedUser.getTasks());
关于java - 如何在 JPA 和 Hibernate 中的实体合并中避免 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256527/
我是一名优秀的程序员,十分优秀!