중복 항목 잡기 예외
이 예외를 포착하려면 어떻게 해야 합니까?
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
'programing' 카테고리의 다른 글
여러 덱스 파일에서 Landroid/support/v4/Accessibility Service/AccessibilityServiceInfoCompat를 정의합니다. (0) | 2023.10.03 |
---|---|
Spring ApplicationContext 계층 구조를 사용하는 이유는 무엇입니까? (0) | 2023.10.03 |
MySQL의 MyISAM 엔진이 Foreign 키를 지원하지 않는 이유는 무엇입니까? (0) | 2023.10.03 |
클래스 및 ID별 요소 내부 요소 가져오기 - JavaScript (0) | 2023.10.03 |
Android에서 텍스트 보기를 위한 둥근 모서리 (0) | 2023.10.03 |