我在考试课上有一列 unique=true..... 我发现因为事务是自动提交的,所以要强制我使用的提交 em.commit()
但是我想知道如何检查它是否唯一。运行查询不是解决方案,因为由于并发性,它可能是检查后的插入......
检查唯一性的最佳方法是什么?
List<Exam_Normal> exam_normals = exam.getExam_Normal();
exam.setExam_Normal(null);
try {
em.persist(exam);
em.flush();
Long i = 0L;
if (exam_normals != null) {
for (Exam_Normal e_n : exam_normals) {
i++;
e_n.setItem(i);
e_n.setId(exam);
em.persist(e_n);
}
}
} catch (Exception e) {
System.out.print("sfalma--");
}
}
日
最佳答案
不幸的是,对于 JPA,无法避免在违反唯一约束时发生事务回滚,因为规范要求此异常来将事务标记为回滚。此外,由于当您使用 JPA 2.0 API 发出“锁定”调用时该行可能不存在,因此“锁定”调用将无法确保只有锁定线程可以插入该对象。 “锁”会阻止实体的更新,但不会阻止插入。
您需要像在代码中一样执行“持久”操作,但使其尽可能靠近事务的开头,或者让该操作在其自己的事务中进行。
如果“持久化”必须是较大事务的一部分,并且持久化失败并不妨碍应用程序的这一部分成功,那么您应该存储此事务中的实体实例,并且您将能够“合并”它们一旦您的应用程序从回滚中恢复,就进入任何后续事务。
关于java - JPA 2.0 EclipseLink 检查唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2641732/