java - JPA 2.0 EclipseLink 检查唯一性

标签 java jpa eclipselink jpa-2.0

我在考试课上有一列 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/

相关文章:

java - 状态模式和策略模式如何结合应用?

java - JPA多对多: Adding existing object to another object

java - JPA:@OneToMany(fetch = FetchType.EAGER)、分页和重复

java - 由于使用保留字作为列名,日期类型的实体管理器提交错误

java - 特定的java方法返回空指针异常

java - 在 while 循环内初始化变量

java - 具有 JavaFx 进度条行为的 Pb

java - 无法延迟初始化角色集合无法初始化代理 - 无 session

java - JPA.withTransaction 执行其他 Controller 方法错误 : Global. java:39: 错误: 'void' 此处不允许类型

java - 如何在Java中自动加载具有@ManyToMany关系的实体