区分hibernate中的不同约束违规

时间:2014-03-23 03:07:15

标签: java mysql database hibernate spring-jdbc

我有一个包含外键和唯一键约束的数据库表。要在数据库表中进行更改,我使用的是使用hibernate的java应用程序。更确切地说,我正在Session.save()进行数据库表的更改。我的代码看起来像这样。

try{
    transaction.begin();
    ------logic-------
    session.save();
    transaction.commit();
}catch(ConstarintViolationException exception){
    ---here is problem------
}

在任何类型约束违规的情况下,hibernate会抛出名为ConstraintViolationException的同一异常。

我的问题是我该怎么做才能确定哪个约束导致了异常。我试着做了

exception.getConstraintName()

但不幸的是我得到null作为输出。

我想区分这两种情况,因为我想在将hibernate异常发送到客户端之前将其转换为我自己的异常。

1 个答案:

答案 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;
    }
}