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

dea*_*mon 23 java jpa exception-handling exception constraints

当违反唯一约束时,javax.persistence.RollbackException抛出a.但是可能有多种理由抛出一个RollbackException.如何才能发现违反了一个独特的约束?

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

Pas*_*ent 19

如何才能发现违反了一个独特的约束?

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

for (t = e.getCause(); t != null; t = t.getCause()) {
    logger.debug("Exception:" + t);
}
Run Code Online (Sandbox Code Playgroud)

对于异常处理和"翻译",你可以做类似Spring的事情(参见各种JpaDialect类,例如HibernateJpaDialect获得一个想法).

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


小智 8

您可以使用以下内容:

如果您使用 spring 框架,那么您可以使用:

org.springframework.dao.DataIntegrityViolationException

如果可以使用以下标准 JPA

org.hibernate.exception.ConstraintViolationException

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

java.sql.SQLIntegrityConstraintViolationException

  • 您不能谈论“标准 JPA”和对 hibernate 的引用。 (3认同)