Hibernate - 如何捕获“完整性约束冲突:唯一约束或索引冲突”错误

5
在我的表中,我有一个唯一约束。当我在Hibernate中添加一个违反该约束的项目时,我希望能够捕获它,以便更新该项而不是创建一个新项。
当我在周围没有设置try-catch块时
    updated = query.executeUpdate();

它会收到以下错误

    Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI

当我设置如下的try-catch块时

    try {
        updated = query.executeUpdate();

     }    
   catch(PersistenceException e){                                                         
        LOG.debug("this is PersistenceException exception throw");      
    } 

它遇到以下错误

    Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly

当我捕获“ConstraintViolationException”时,我只是一直得到约束异常,并没有捕获任何东西。

    Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI

我该如何捕捉它?

建议查看此SO链接:SO链接 - aksappy
2个回答

0

要捕获唯一约束,您应该捕获此异常ConstraintViolationException


当我这样做时,它没有捕获到任何东西,我只是一直收到“Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI” 的错误提示。 - Ken Vernaillen
你尝试过捕获 HibernateException 吗? - mvb13
我使用DataIntegrityViolationException异常来捕获它。 - toquart

-1
由于在更高的层级上设置了@Transactional,所以RollbackException被抛出到更高的层级,因此您无法在该层级上捕获它。您需要在事务层面上捕获它。
一个更好的方法是在数据库层面上进行对象存在性检查。这个检查函数是通过唯一约束来实现的。这样做更好,因为您不需要捕获异常。
您已经需要该对象的获取函数,因为之后您想要合并该对象。您不希望合并一个已分离的实例。

6
在数据库同时访问的情况下,这种方法行不通。在你检查和执行其他操作之间,另一个会话可能已经改变了数据库状态。 - WW.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接