使用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);
}
...
}
答案 0 :(得分:0)
以departmentRepository.save
的方式执行它,使其使用saveOrUpdate(如果直接使用Hibernate)或合并(如果使用JPA API)。
答案 1 :(得分:0)
您在错误的位置捕获异常。您在此处显示的捕获类型应在事务之外进行。只有这样,您才能确保会话中的实体一致。