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