Hibernate - 如何捕获“完整性约束违规:唯一约束或索引违规”

Ken*_*len 5 hibernate exception rollback unique-constraint hibernateexception

在我的表中,我有一个独特的约束。在休眠中,当我添加一个违反该约束的项目时,我想捕获它,因此它将更新而不是创建一个项目。

当我没有设置 try-catch 块时

    updated = query.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

它得到以下错误

    Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI
Run Code Online (Sandbox Code Playgroud)

当我设置以下 try-catch 块时

    try {
        updated = query.executeUpdate();

     }    
   catch(PersistenceException e){                                                         
        LOG.debug("this is PersistenceException exception throw");      
    } 
Run Code Online (Sandbox Code Playgroud)

它收到以下错误

    Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly
Run Code Online (Sandbox Code Playgroud)

当我捕获“ConstraintViolationException”时,我只是不断收到约束异常,它没有捕获任何东西。

    Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI
Run Code Online (Sandbox Code Playgroud)

我怎么能抓住这个?

Ken*_*len -1

由于设置在较高的杠杆中,因此会在较高的RollbackException水平上抛出@Transactional,因此您无法在该水平上接住它。您需要在交易层捕获它。

更好的方法是检查该对象是否已存在于数据库层上。一个检查功能。该检查函数是通过唯一约束得到的。这更好,因为您不需要捕获异常。

您已经需要该对象的 get 函数,因为稍后您想要合并该对象。您不想合并分离的实例。

  • 这在并发访问数据库的情况下不起作用。在您检查和执行其他操作之间,另一个会话可能已经更改了数据库状态。 (6认同)