如何处理 JPA 唯一约束违规?

当违反唯一约束时,将抛出 a。但是,可能有多个原因可以抛出.如何发现违反了唯一约束?javax.persistence.RollbackExceptionRollbackException

try {
    repository.save(article);
}
catch(javax.persistence.RollbackException e) {
    // how to find out the reason for the rollback exception?
}

答案 1

如何发现违反了唯一约束?

异常是链接的,您必须以递归方式调用以获取特定于提供程序的异常(并且可能向下转到)以将其转换为应用程序可以很好地处理用户的内容。下面将打印异常链:getCause()SQLException

for (t = e.getCause(); t != null; t = t.getCause()) {
    logger.debug("Exception:" + t);
}

对于异常处理和“翻译”,你可以做一些像Spring一样的事情(参见各种类,例如HibernateJpaDialect来获得一个想法)。JpaDialect

所有这些都不好,这段代码不会是可移植的,找到导致违规的属性并不容易。这在某种程度上证实了在 JPA 中没有优雅且可移植的方法来处理约束冲突


答案 2

您可以使用以下内容:

如果您使用的是弹簧框架,则可以使用:

org.springframework.dao.DataIntegrityViolationException

如果可以使用标准 JPA 以下

org.hibernate.exception.ConstraintViolationException

在sql级别可以使用以下内容:

java.sql.SQLIntegrityConstraintViolationException


推荐