JPA:并行线程:插入相同的记录:SQLIntegrityConstraintViolationException

时间:2018-12-26 13:09:08

标签: jpa parallel-processing

使用JPARepository,我们尝试保留部门和学生的详细信息(如果尚不存在)。在单线程环境中可以正常工作。

但是,使用多个线程失败。

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'DEP12' for key 'departmentId'

代码段:

@Transactional
public void persistDetails(String departmentName, String studentName)
{
        Department dep= departmentRepository.findByDepartmentName(departmentName);
        if (dep== null) {
            dep= createDepartmentObject(departmentName);
            departmentRepository.save(dep);
        }

        ... 
}

如何在多线程环境中实现这一目标。我们不必失败,而是使用现有记录并执行其他操作。

此外,尝试捕获异常并在其中进行选择查询。但是,在这种情况下,它是从缓存对象而不是从DB获取的。

捕获异常:代码段:

@Transactional
    public void persistDetails(String departmentName, String studentName)
    {
             Department dep= departmentRepository.findByDepartmentName(departmentName);

            try{                 
              if (dep== null) {
                dep= createDepartmentObject(departmentName);
                departmentRepository.save(dep);
              }
            }
            catch(Exception e)
            {
                 dep= departmentRepository.findByDepartmentName(departmentName);
            }
            ... 
    }

2 个答案:

答案 0 :(得分:0)

departmentRepository.save的方式执行它,使其使用saveOrUpdate(如果直接使用Hibernate)或合并(如果使用JPA API)。

答案 1 :(得分:0)

您在错误的位置捕获异常。您在此处显示的捕获类型应在事务之外进行。只有这样,您才能确保会话中的实体一致。