Подтвердить что ты не робот

Исключить ошибку

Как я могу поймать это исключение:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
                                      Duplicate entry '22-85' for key 'ID_CONTACT'
4b9b3361

Ответ 1

Я использую весну, поэтому мы решаем ее с помощью org.springframework.dao.DataIntegrityViolationException

    try {
        ao_history_repository.save(new AoHistory(..));
    }
    catch (DataIntegrityViolationException e) {
        System.out.println("history already exist");
    }

Но, как @KevinGuancheDarias упомянул это:

Обратите внимание, что пока это работает. Я предлагаю решить проблему путем выдача findBy перед сохранением, так как это грязно, и я думаю, что это не гарантируется, что он будет работать в будущих версиях, может даже сломаться без уведомления.

Ответ 2

catch SQLIntegrityConstraintViolationException, если вы используете Java 1.6 +

например.

try {
    ps.executeUpdate("INSERT INTO ...");
} catch (SQLIntegrityConstraintViolationException e) {
    // Duplicate entry
} catch (SQLException e) {
    // Other SQL Exception
}

или

try {
    ps.executeUpdate("INSERT INTO ...");
} catch (SQLException e) {
    if (e instanceof SQLIntegrityConstraintViolationException) {
        // Duplicate entry
    } else {
        // Other SQL Exception
    }
}

Ответ 3

vendorCode 2601 предназначен для unique index constraint нарушения unique index constraint поэтому вы можете проверить SQLException cewndorCode с помощью e.getErrorCode() == 2601. образец кода:

try {
    ao_history_repository.save(new AoHistory(..));
} catch (SQLException e) {
    if (e.getErrorCode() == 2601) {
        System.out.println("handle duplicate index error here!");
    } else {
        System.out.println("handle other error code here!");
    }
}

Ответ 4

Я использую Spring. Поэтому catch org.springframework.dao.DuplicateKeyException

try{
    ...
} catch (DuplicateKeyException dke) {
    ...
} 

Ответ 5

A - Зарегистрируйте исключение подробно

Вот что я использую для регистрации исключений SQL, чтобы быть уверенным в том, что ловить;

private static void handleSQLError(SQLException e) throws SQLException {
    log.info("SQL Error Type : " + e.getClass().getName());
    log.info("Error Message  : " + e.getMessage());
    log.info("Error Code     : " + e.getErrorCode());
    log.info("SQL State      : " + e.getSQLState());

    throw e;
}

Вот пример вывода;

2018 Nis 05 11:20:32,248 INFO MySQLUtil: SQL Error Type : com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
2018 Nis 05 11:20:32,248 INFO MySQLUtil: Error Message  : Duplicate entry 'test2 CAMT052' for key 'customer_file_customer_file_name_idxu'
2018 Nis 05 11:20:32,249 INFO MySQLUtil: Error Code     : 1062
2018 Nis 05 11:20:32,249 INFO MySQLUtil: SQL State      : 23000
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'test' for key 'customer_file_customer_file_name_idxu'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)

B - поймать исключение и проверить параметры

Чтобы отловить исключение дубликата ключа, нам нужно отловить определенный класс, который является MySQLIntegrityConstraintViolationException. Также следующий параметр должен совпадать;

SQL State      : 23000

Поэтому я использую следующий блок для перехвата повторяющихся записей;

try {
    dbUtil.persistEntry(entry);
} catch (SQLException e) {
    if(e instanceof MySQLIntegrityConstraintViolationException) {
        if(e.getSQLState().equals("23000")) {
            if(e.getMessage().contains("Duplicate")) {
                isDuplicateEntryError = true;
            }
        }
    }
}

Ответ 6

В моем проекте Spring было выброшено исключение org.springframework.orm.jpa.JpaSystemException: org.hibernate.exception.ConstraintViolationException: could not execute statement; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement.

Итак, после отладки у меня был родитель JpaSystemException с причиной PersistenceException, и у него была причина ConstraintViolationException, у этого последнего было исключение, специфичное для базы данных, но я в итоге поймал ConstraintViolationException с помощью

public static boolean isSqlDuplicatedKey(Exception e) {
        return e.getCause() != null && e.getCause().getCause() != null
                && ConstraintViolationException.class.isInstance(e.getCause().getCause());
}
// ....

try {
   someRepository.save(some);
} catch (JpaSystemException e) {
    if (ExceptionUtilService.isSqlDuplicatedKey(e)) {
        // Do something to handle it
    } else {
        throw e;
    }
}

Обратите внимание, что пока это работает. Я предлагаю решить эту проблему, выполнив findBy перед сохранением, так как это грязно, и я думаю, что не гарантируется, что оно будет работать в будущих версиях, может даже выйти из строя без уведомления.

Ответ 7

Следующий код работает для меня:

try {
    requete.executeUpdate();
} catch (final ConstraintViolationException e) {

}

Ответ 8

Я согласен, но у нас есть что-то подобное в моем приложении Spring: - RequestValidationException/MessageConstants являются собственными:

import org.springframework.dao.DuplicateKeyException;
|
|
|
catch (Exception exception) {
if(exception instanceof DuplicateKeyException) {
 logger.error("exception as duplicate Name Found: " + exception.getMessage());
 throw new RequestValidationException(MessageConstants.DUPLICATE_NAME_FOUND_ERROR_CD, MessageConstants.DUPLICATE_NAME_FOUND_ERROR_MSG); 
 }else{
        logger.error("exception on update: " + exception.getMessage());
        throw exception;
    }
 }

Ответ 9

Посмотрите на исходный код среды Spring. Посмотрите на код разрешения ошибок JDBC spring.

org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator # doTranslate

else if (Arrays.binarySearch(this.sqlErrorCodes.getDuplicateKeyCodes(), errorCode) >= 0)

{ logTranslation(task, sql, sqlEx, false); return new DuplicateKeyException(buildMessage(task, sql, sqlEx), sqlEx); }

Есть несколько способов, как вы можете поразить разных переводчиков исключений:

  • Spring загрузить метаданные/коды ошибок из вашей базы данных - один переводчик
  • Spring не может подключиться к БД - еще один
  • Hibernate JPA может иметь другой переводчик

Таким образом, поведение Dublicate может измениться с DuplicateKeyException на DataIntegrityViolationException.