SQL遇到约束时来自Hibernate的语义异常

时间:2017-07-01 12:23:44

标签: postgresql hibernate

我在Postgre 9.5中使用Hibernate 5.2。 我的数据库架构有几个约束。有没有"容易"是否可以向最终用户公开约束名称?想象一下,我有独特的约束

ALTER TABLE JobTable
  ADD CONSTRAINT JobTableJobStatusEnum
CHECK (jobStatus IN ('JobSubmitted', 'JobRunning', 'JobFailed', 'JobKilled', 'JobSucceeded'));

我想重新抛出类似的东西 ConstraintViolationException("无法执行操作。您的查询会破坏JobTableJobStatusEnum")

是的,它对业务用户没有任何意义,但其他开发人员会理解这个问题。我可以从DB中获取约束def并将其置于异常消息中。

1 个答案:

答案 0 :(得分:1)

基本上你在异常中有约束信息 - stacktrace。

如果你需要包装原始异常并添加一些自定义(它不是自定义它只是更改异常消息),你可以捕获ConstraintViolationException(或异常并检查它是由ConstraintViolationException引起的apache commons-lang ExceptionUtils util)

catch(ConstraintViolationException e){
    Strign message = e.getCause().getMessage();
    .....
    work with message
    String detailMessage = String.format("Can't execute operation. Your query breaks %" , message);  
    throw new ConstraintViolationException(detailMessage , e);
}

对于 mysql (对于Postgre应该类似),它看起来像

  

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:   重复输入'testemail@gmail.com'作为密钥   'UK_n7ihswpy07ci568w34q0oi8he'

如果您知道数据库中ConstraintViolation的格式消息,则可以从异常消息方法获取约束名称。