0

我在考试类中有一个唯一 = 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--");
    }
}

d

4

3 回答 3

3

不幸的是,使用 JPA 无法避免因违反唯一约束而导致事务回滚,因为规范要求此异常将事务标记为回滚。此外,因为当您使用 JPA 2.0 API 发出“锁定”调用时,该行可能不存在,所以“锁定”调用不能确保只有锁定线程才能插入对象。“锁定”会阻止更新实体,但不会阻止插入。

您需要像在代码中那样执行“持久化”,但尽可能将其保持在事务的开头,或者让操作在其自己的事务中发生。

如果“持久化”必须是较大事务的一部分,并且无法持久化并不妨碍您的应用程序的这一部分成功,那么您应该存储该事务中的实体实例,您将能够将它们“合并”到任何后续应用程序从回滚中恢复后的事务。

于 2010-04-15T20:22:41.040 回答
1

但是我想知道如何检查它是否是唯一的。运行查询不是解决方案,因为它可能是由于并发检查后的插入......

JPA 2.0 允许悲观锁定并为此添加了三种锁定模式。这可能是您的用例的一个选项。

一些参考资料:

于 2010-04-15T00:05:46.057 回答
0

我假设该列不是主键 ( @Id),在这种情况下,您的应用程序必须保证唯一性。字段唯一性的保证可能必须来自其他地方。该字段是什么类型的值?这里有一些想法

如果它是一个计数器,那么您可能可以使用@Singleton有状态 bean(JavaEE 6。请参阅.

如果您使用的是 EE5,那么一个无状态 bean@Entity会映射到自动生成的密钥。

于 2010-04-15T00:24:08.290 回答