JPA: параллельный поток: вставка одной и той же записи: SQLIntegrityConstraintViolationException - PullRequest
0 голосов
/ 26 декабря 2018

Используя 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);
        }

        ... 
}

Какдобиться этого в многопоточной среде.Нам не нужно терпеть неудачу, вместо этого использовать существующую запись и выполнять другие операции.

Также попытался перехватить исключение и выполнить внутри него запрос выбора.Но в этом случае он извлекается из объекта кэша, а не из БД.

Исключение отлова: фрагмент кода:

@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 голосов
/ 27 декабря 2018

Вы ловите исключение не в том месте.Вид улова, который вы показываете здесь, должен быть сделан вне транзакции.Только тогда вы можете быть уверены, что у вас есть согласованные сущности в сеансе.

0 голосов
/ 26 декабря 2018

Реализуйте ваш departmentRepository.save таким образом, чтобы он использовал saveOrUpdate (если вы используете Hibernate напрямую) или слияние (если вы используете JPA API).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...