我有一个包含外键和唯一键约束的数据库表。要在数据库表中进行更改,我使用的是使用hibernate的java应用程序。更确切地说,我正在Session.save()
进行数据库表的更改。我的代码看起来像这样。
try{
transaction.begin();
------logic-------
session.save();
transaction.commit();
}catch(ConstarintViolationException exception){
---here is problem------
}
在任何类型约束违规的情况下,hibernate会抛出名为ConstraintViolationException
的同一异常。
我的问题是我该怎么做才能确定哪个约束导致了异常。我试着做了
exception.getConstraintName()
但不幸的是我得到null
作为输出。
我想区分这两种情况,因为我想在将hibernate异常发送到客户端之前将其转换为我自己的异常。
答案 0 :(得分:0)
我想说让数据库检测出违反约束的行为......
或者
您可以使用类似下面的类来帮助您捕获约束违例异常......
public class DataIntegrityViolationExceptionsAdvice {
public void afterThrowing(DataIntegrityViolationException ex) throws DataIntegrityViolationException {
// extract the affected database constraint name:
String constraintName = null;
if ((ex.getCause() != null) && (ex.getCause() instanceof ConstraintViolationException)) {
constraintName = ((ConstraintViolationException) ex.getCause()).getConstraintName();
}
// create a detailed message from the constraint name if possible
String message = ConstraintMsgKeyMappingResolver.map(constraintName);
if (message != null) {
throw new DetailedConstraintViolationException(message, ex);
}
throw ex;
}
}