我在Postgre 9.5中使用Hibernate 5.2。 我的数据库架构有几个约束。有没有"容易"是否可以向最终用户公开约束名称?想象一下,我有独特的约束
ALTER TABLE JobTable
ADD CONSTRAINT JobTableJobStatusEnum
CHECK (jobStatus IN ('JobSubmitted', 'JobRunning', 'JobFailed', 'JobKilled', 'JobSucceeded'));
我想重新抛出类似的东西 ConstraintViolationException("无法执行操作。您的查询会破坏JobTableJobStatusEnum")
是的,它对业务用户没有任何意义,但其他开发人员会理解这个问题。我可以从DB中获取约束def并将其置于异常消息中。
答案 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的格式消息,则可以从异常消息方法获取约束名称。