【问题标题】:Hibernate - how to catch "integrity constraint violation: unique constraint or index violation"Hibernate - 如何捕获“完整性约束违规:唯一约束或索引违规”
【发布时间】:2013-11-27 04:55:21
【问题描述】:

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

当我没有设置 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

我怎样才能捕捉到这个?

【问题讨论】:

标签: hibernate exception rollback unique-constraint hibernateexception


【解决方案1】:

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

【讨论】:

  • 当我这样做时,它什么也抓不到,我只是不断收到“原因:org.hsqldb.HsqlException:完整性约束违规:唯一约束或索引违规:WEEKROOSTERITEMUNI”
  • 你尝试捕捉 HibernateException 吗?
  • 我用 DataIntegrityViolationException 异常捕获它
【解决方案2】:

RollbackException 被扔到更高的水平,因为@Transactional 设置在更高的杠杆上,所以你无法在那个水平上抓住它。您需要在事务层中捕获它。

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

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

【讨论】:

  • 这在并发访问数据库时不起作用。在你检查和你做其他事情之间,另一个会话可能已经改变了数据库状态。
猜你喜欢
  • 2022-01-23
  • 2018-01-10
  • 2015-11-03
  • 2018-06-28
  • 2014-11-29
  • 2020-04-22
  • 1970-01-01
  • 2015-05-07
  • 2016-11-22
相关资源
最近更新 更多