【问题标题】:How to avoid java.util.ConcurrentModificationException in entity merging in JPA and Hibernate如何在 JPA 和 Hibernate 中的实体合并中避免 java.util.ConcurrentModificationException
【发布时间】:2017-07-04 12:51:36
【问题描述】:

我在这个应用程序中使用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

我尝试使用迭代器而不是使用 for-each 循环。但同样的结果。在另一种方式中,我尝试使用单独的列表来添加新旧任务,而不是使用与上面相同的列表。但是当我调用entityManager.merge(user); 时,它会删除现有任务并重新添加新旧任务。我需要做些什么来避免出现此异常?

感谢您的帮助,因为我是 jpa 的新手。

【问题讨论】:

  • 你能发布整个堆栈跟踪吗?
  • @ketanvijayvargiya 是的,当然。这是复制堆栈跟踪的链接 [pastebin.com/QhZH5CHm] 感谢您的关注。

标签: java spring hibernate jpa jpa-2.0


【解决方案1】:

尝试改变这个:

//Get existing tasks for loggedUser
List<Task> existingTasks = loggedUser.getTasks();

到这里:

//Get existing tasks for loggedUser
List<Task> existingTasks = new ArrayList<>(loggedUser.getTasks());

【讨论】:

  • 它之所以有效,是因为您在迭代集合时无法修改它。但是,如果您迭代一个新集合,您可以从原始集合中删除。
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2020-12-13
相关资源
最近更新 更多