When a unique constraint is violated, a javax.persistence.RollbackException is thrown. But there could be multiple reasons to throw a RollbackException. How can I find out that a unique constraint was violated?
try {
repository.save(article);
}
catch(javax.persistence.RollbackException e) {
// how to find out the reason for the rollback exception?
}
Exception are chained, you have to call
getCause()recursively to get the provider specific exception (and maybe go down to theSQLException) to translate it into something your application can handle nicely for your user. The following will print the chain of exception:For the exception handling and the “translation”, you could do something like what Spring does (see the various
JpaDialectclasses, e.g.HibernateJpaDialectto get an idea).All this is not nice, this code won’t be portable and finding what attribute(s) caused the violation won’t be easy. This somehow confirms that there is no elegant and portable way to handle constraint violations in JPA.