2017-02-15 69 views
2

我在这个应用程序中使用Spring MVC + Hibernate + JPA。我需要做的是,更新与另一个实体(任务)关系@manyToMany关系的实体(用户)。这里是我的代码,如何避免JPA和休眠中的实体合并java.util.ConcurrentModificationException

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循环。但结果相同。换句话说,我尝试使用单独的List来添加新旧任务,而不是像上面那样使用相同的列表。但是当我拨打entityManager.merge(user);它删除了现有任务并重新添加了新旧任务。我需要做什么来避免发生这种异常?

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

+1

您可以张贴整个堆栈跟踪? –

+0

@ketanvijayvargiya当然可以。这里是复制stacktrace的链接[http://pastebin.com/QhZH5CHm]感谢您的关注。 – RYJ

回答

2

尝试修改此:

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

这样:

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