Обработка исключений EntityManager в сессионном компоненте

У меня есть управляемый сессионный компонент без сохранения состояния с внедренным EntityManager em.

Я пытаюсь создать таблицу базы данных с уникальным столбцом. Затем я запускаю некоторый алгоритм, который пытается вставить объект. Однако, если сущность существует, она обновит ее или пропустит.

Я хотел бы иметь что-то вроде этого:

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?

Спасибо за любые идеи и опыт с этим.

 nwallman26 окт. 2012 г., 16:20
Когда вы говорите, что ваше DatabaseException не перехвачено, вы имеете в виду, что не видите его в PersistenceException? Что-то вроде: вызвано: DatabaseException?
 Macejkou26 окт. 2012 г., 19:11
Я вижу это вложенным в PersistenceException. Но перехват кода (DatabaseException e) не работает. Если DatabaseException вложено в PersistenceException, как я могу вызвать метод getDatabaseErrorCode ()? Может быть, это основной вопрос Java.

Ответы на вопрос(1)

Решение Вопроса

которое я использую в своем приложении. Мы можем получитьSQLException изPersistenceException, После этого попробуйте получитьsql error code заSQLException, Если ваше требование заключается в том, чтобы получить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 

Ваш ответ на вопрос