title: Quarkus + Panache. Handle persistence exception (unique constraint)
body: <p>I'm having trouble catching an exception with quarkus+panache repository.</p>
  <p>I have a simple class with with a unique contrain</p>
  <pre><code>@Entity()
  public class Todo extends PanacheEntityBase {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Type(type = &quot;pg-uuid&quot;)
      private UUID id;
  
      @Column(unique = true)
      public String title;
  
      public String url;
  
      public boolean completed;
  
      @Column(name = &quot;ordering&quot;)
      public int order;
  }
  </code></pre>
  <p>And I have a simple controller:</p>
  <pre><code>    @POST
      @Transactional
      public ReadTodoDto createTodo(@Valid CreateTodoDto createTodoDto) {
          try {
              var todo = todoMapper.toSource(createTodoDto);
              todo.persist();
              return todoMapper.toResource(todo);
          } catch (PersistenceException p) {
              // here I would love to handle the &quot;javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException&quot;
              // But im forced to catch Exception instead making it impossible to parse
              return null;
          }
      }
  </code></pre>
  <p>If I try to catch <code>javax.persistence.PersistenceException</code>, my controller blows with the following exception:</p>
  <pre><code>2020-12-03 21:39:36,101 ERROR [org.hib.eng.jdb.spi.SqlExceptionHelper] (executor-thread-199) ERROR: duplicate key value violates unique constraint &quot;todo_title_key&quot;
    Detail: Key (title)=(string) already exists.
  2020-12-03 21:39:36,102 WARN  [com.arj.ats.arjuna] (executor-thread-199) ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple&lt; 0:ffffc0a801bb:b40d:5fc98311:47, org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization@42b0c749 &gt;: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
          at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1366)
          at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)
          at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)
          at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)
          at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
          at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:355)
          at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
          at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
          at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
          at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:360)
          at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
          at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
          at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1295)
          at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
          at io.quarkus.narayana.jta.runtime.CDIDelegatingTransactionManager.commit(CDIDelegatingTransactionManager.java:97)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.endTransaction(TransactionalInterceptorBase.java:311)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:160)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:100)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:32)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:53)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:26)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(TransactionalInterceptorRequired_Bean.zig:340)
          at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
          at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
          at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
          at org.acme.controller.TodoController_Subclass.createTodo(TodoController_Subclass.zig:226)
          at org.acme.controller.TodoController_ClientProxy.createTodo(TodoController_ClientProxy.zig:128)
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
          at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.base/java.lang.reflect.Method.invoke(Method.java:566)
          at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170)
          at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
          at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:643)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:507)
          at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:457)
          at org.jboss.resteasy.core.ResourceMethodInvoker$$Lambda$577/0000000000000000.get(Unknown Source)
          at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:459)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:419)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:393)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
          at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
          at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
          at org.jboss.resteasy.core.SynchronousDispatcher$$Lambda$572/0000000000000000.run(Unknown Source)
          at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
          at org.jboss.resteasy.core.SynchronousDispatcher$$Lambda$573/0000000000000000.get(Unknown Source)
          at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
          at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
          at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
          at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:136)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:40)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
          at io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:231)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
          at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
          at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
          at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
          at java.base/java.lang.Thread.run(Thread.java:834)
          at org.jboss.threads.JBossThread.run(JBossThread.java:479)
  Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
          at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:109)
          at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
          at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
          at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
          at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3301)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)
          at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)
          at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
          at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
          at org.hibernate.engine.spi.ActionQueue$$Lambda$811/0000000000000000.accept(Unknown Source)
          at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
          at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
          at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)
          at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
          at org.hibernate.internal.SessionImpl$$Lambda$820/0000000000000000.accept(Unknown Source)
          at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
          at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
          ... 64 more
  Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint &quot;todo_title_key&quot;
    Detail: Key (title)=(string) already exists.
          at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
          at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
          at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)
          at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473)
          at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393)
          at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
          at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130)
          at io.agroal.pool.wrapper.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:86)
          at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
          ... 77 more
  
  2020-12-03 21:39:36,106 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-199) HTTP Request to /quarks failed, error id: 0848ccc2-0f3a-49f8-846c-6d9173bb0bcf-8: org.jboss.resteasy.spi.UnhandledException: io.quarkus.arc.ArcUndeclaredThrowableException: Error invoking subclass method
          at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106)
          at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:372)
          at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218)
          at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519)
          at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
          at org.jboss.resteasy.core.SynchronousDispatcher$$Lambda$572/0000000000000000.run(Unknown Source)
          at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
          at org.jboss.resteasy.core.SynchronousDispatcher$$Lambda$573/0000000000000000.get(Unknown Source)
          at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
          at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
          at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
          at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:136)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:40)
          at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
          at io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:231)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
          at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
          at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
          at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
          at java.base/java.lang.Thread.run(Thread.java:834)
          at org.jboss.threads.JBossThread.run(JBossThread.java:479)
  Caused by: io.quarkus.arc.ArcUndeclaredThrowableException: Error invoking subclass method
          at org.acme.controller.TodoController_Subclass.createTodo(TodoController_Subclass.zig:248)
          at org.acme.controller.TodoController_ClientProxy.createTodo(TodoController_ClientProxy.zig:128)
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
          at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.base/java.lang.reflect.Method.invoke(Method.java:566)
          at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170)
          at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
          at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:643)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:507)
          at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:457)
          at org.jboss.resteasy.core.ResourceMethodInvoker$$Lambda$577/0000000000000000.get(Unknown Source)
          at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:459)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:419)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:393)
          at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
          at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
          ... 22 more
  Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
          at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1307)
          at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
          at io.quarkus.narayana.jta.runtime.CDIDelegatingTransactionManager.commit(CDIDelegatingTransactionManager.java:97)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.endTransaction(TransactionalInterceptorBase.java:311)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:160)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:100)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:32)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:53)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:26)
          at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(TransactionalInterceptorRequired_Bean.zig:340)
          at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
          at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
          at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
          at org.acme.controller.TodoController_Subclass.createTodo(TodoController_Subclass.zig:226)
          ... 39 more
  Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
          at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
          at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1366)
          at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)
          at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)
          at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)
          at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
          at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:355)
          at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
          at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
          at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
          at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:360)
          at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
          at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
          at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1295)
          ... 52 more
  Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
          at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:109)
          at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
          at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
          at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
          at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3301)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)
          at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)
          at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
          at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
          at org.hibernate.engine.spi.ActionQueue$$Lambda$811/0000000000000000.accept(Unknown Source)
          at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
          at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
          at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)
          at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
          at org.hibernate.internal.SessionImpl$$Lambda$820/0000000000000000.accept(Unknown Source)
          at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
          at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
          ... 64 more
  Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint &quot;todo_title_key&quot;
    Detail: Key (title)=(string) already exists.
          at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
          at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
          at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)
          at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473)
          at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393)
          at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
          at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130)
          at io.agroal.pool.wrapper.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:86)
          at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
          ... 77 more
  </code></pre>
  <p>What am I missing?  I could not found any examples of handling this kind of exceptions (unique contrains for example).</p>