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? }
To handle unique constraint violations: Catch uniqueness exceptions thrown by the database at the lowest level possible — in the UnitOfWork class. Convert them into Result. Use the UnitOfWork in the controller to explicitly commit pending changes and see if there are any uniqueness constraint violations.
A unique constraint violation occurs when an UPDATE or INSERT statement attempts to insert a record with a key that already exists in the table. Take a look at the package that is throwing the error.
begin merge into some_table st using (select 'some' name, 'values' value from dual) v on (st.name=v.name) when matched then update set st. value=v. value when not matched then insert (name, value) values (v.name, v.
A unique constraint can be either a column constraint or a table constraint. At the table level, we can define unique constraints across multiple columns. JPA allows us to define unique constraints in our code using @Column(unique=true) and @UniqueConstraint.
How can I find out that a unique constraint was violated?
Exception are chained, you have to call getCause()
recursively to get the provider specific exception (and maybe go down to the SQLException
) to translate it into something your application can handle nicely for your user. The following will print the chain of exception:
for (t = e.getCause(); t != null; t = t.getCause()) { logger.debug("Exception:" + t); }
For the exception handling and the "translation", you could do something like what Spring does (see the various JpaDialect
classes, e.g. HibernateJpaDialect
to 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With