programing

중복 항목 잡기 예외

muds 2023. 10. 3. 11:38
반응형

중복 항목 잡기 예외

이 예외를 포착하려면 어떻게 해야 합니까?

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

나는 봄을 사용하기 때문에 우리는 그것을 해결합니다.org.springframework.dao.DataIntegrityViolationException

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

그러나 @KevinGuancheDarias가 언급한 바와 같이:

이 작업이 진행되는 동안 참고하시기 바랍니다.저장 전에 findBy를 발행하여 문제를 해결할 것을 제안합니다. 이는 지저분하고, 향후 버전에서 작동할 것이 보장되지 않는다고 생각하기 때문에 알림 없이 깨질 수도 있습니다.

SQL 무결성 제약 조건 위반을 탐지예외, 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
    }
}

저는 스프링을 씁니다.그러니까 잡으세요. 봄 틀. 다오.키 복제예외.

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

벤더코드2601을 위한.unique index constraint어겨서 SQLException cewdorCode를 확인할 수 있습니다.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!");
    }
}

A - 예외 상세 기록

다음은 SQL Exceptions를 기록하는 데 사용하는 방법으로 무엇을 잡을지 확실하게 확인할 수 있습니다.

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 - Exception을 잡고 파라미터를 확인합니다.

중복 키를 잡으려면 다음과 같은 특정 클래스를 잡아야 합니다.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;
            }
        }
    }
}

스프링 프레임워크 소스 코드 봄 JDBC 오류 해결 코드 봄 JDBC 오류 해결 코드 보기

organ.spring framework. jdbc.support.SQE 오류 코드SQLexceptionTranslator#doTranslate

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

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

여러 가지 예외 변환기를 칠 수 있는 방법은 여러 가지가 있습니다.

  • DB에서 스프링 로드 메타데이터/오류 코드 - 번역기 하나
  • 스프링이 db에 연결하지 못함 - 다른 것
  • 최대 절전 모드 JPA에 다른 변환기가 있을 수 있음

그래서 DuplicateKey에서 Dublicate 동작이 변경될 수 있습니다.Data Integrity 위반에 대한 예외예외.

스프링 프로젝트에서 예외는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를 발행하여 문제를 해결할 것을 제안합니다. 이는 지저분하고, 향후 버전에서 작동할 것이 보장되지 않는다고 생각하기 때문에 알림 없이 깨질 수도 있습니다.

저는 다음 코드를 사용할 수 있습니다.

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

}

동의합니다. 하지만 Spring Application에는 이와 같은 내용이 있습니다.: - Request ValidationException/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;
    }
 }

언급URL : https://stackoverflow.com/questions/27582757/catch-duplicate-entry-exception

반응형