我有一个注入了EntityManager em的托管无状态会话bean。

我想做的是让数据库表具有唯一列。然后,我运行一些尝试插入实体的算法。如果实体存在,它将更新或跳过它。

我想要这样的东西:

try {
em.persist(cd);
em.flush();
} catch (PersistenceException e) {
// Check if the exception is DatabaseException and ConstraintViolation
    // Update instead or skip it
}

问题是我只能捕获PersistenceException。未捕获DatabaseException。很可悲,因为只有DatabaseException拥有我想用来检查重复条目的名为getDatabaseErrorCode()的方法。我不明白,因为PersistenceException.getCause()返回DatabaseException

所以我的问题是:如何捕获DatabaseException并检查MySQL错误代码?

感谢您的任何想法和经验。

最佳答案

我有一个建议,可以在我的应用程序中使用。我们可以从SQLException检索PersistenceException。之后,尝试获取sql error codeSQLException。如果您需要获取sql error code,则可以按照我的示例进行;

public void insert(Group group) throws DAOException {
    try {
        //your operation
        em.flush();
        logger.debug("insert() method has been successfully finisehd.");
    } catch (PersistenceException pe) {
        String sqlErroCode = getErrorCode(pe);
        // do your operation based on sql errocode
    }
}

protected String getErrorCode(RuntimeException e) {
    Throwable throwable = e;
    while (throwable != null && !(throwable instanceof SQLException)) {
        throwable = throwable.getCause();
    }
    if (throwable instanceof SQLException) {
        Properties properties = --> load sql error code form configuration file.
        SQLException sqlex = (SQLException) throwable;
        String errorCode = properties.getProperty(sqlex.getErrorCode() + "");
        return errorCode;
    }
    return "NONE";
}

mysql的错误代码示例配置

mysql_error_code.properties
#MySQL Database
1062=DUPLICATE_KEY_FOUND
1216=CHILD_RECORD_FOUND
1217=PARENT_RECORD_NOT_FOUND
1048=NULL_VALUE_FOUND
1205=RECORD_HAS_BEEN_LOCKED

09-30 09:13