web-dev-qa-db-ja.com

重複エントリの例外をキャッチ

この例外をどのようにキャッチできますか:

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

スプリングを使用しているので、org.springframework.dao.DataIntegrityViolationException

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

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
    }
}
10
auntyellow

vendorCode _2601_は_unique index constraint_に違反するため、e.getErrorCode() == 2601でSQLException cewndorCodeを確認できます。サンプルコード:

_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!");
    }
}
_
2
mohsenJsh

私はSpringを使用しています。 org.springframework.dao.DuplicateKeyExceptionをキャッチします

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

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;
            }
        }
    }
}
1

Springフレームワークを見る ソースコード spring JDBCエラー解決コードを見てください。

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); }

異なる例外トランスレーターをヒットする方法は複数あります。

  • データベースからのスプリングロードメタデータ/エラーコード-1人の翻訳者
  • Springはdbへの接続に失敗します-もう1つ
  • Hibernate JPAには異なるトランスレーターが含まれる場合があります

したがって、Dublicateの動作はDuplicateKeyExceptionからDataIntegrityViolationExceptionに変更される場合があります。

0
Dennis R

私は同意しますが、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;
    }
 }
0
srinivasy

次のコードは私のために機能します:

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

}
0
SEIYA