2010-08-17 3 views
19

고유 제한 조건을 위반하면 javax.persistence.RollbackException이 발생합니다. 하지만 RollbackException을 던지려면 여러 가지 이유가있을 수 있습니다. 고유 한 제약 조건을 위반했음을 어떻게 알 수 있습니까?JPA 고유 제한 조건 위반을 처리하는 방법은 무엇입니까?

try { 
    repository.save(article); 
} 
catch(javax.persistence.RollbackException e) { 
    // how to find out the reason for the rollback exception? 
} 

답변

17

고유 제한 조건이 위반되었다는 것을 어떻게 알 수 있습니까?

예외는 공급자 특정 예외가 (어쩌면 아래로 SQLException로 이동) 응용 프로그램이 사용자에 대해 잘 처리 할 수있는 무언가로 번역하기 위해 반복적으로 getCause() 전화를해야, 체인된다. 예외 처리하고 "번역"당신이 (아이디어를 얻기 위해, 예를 들어, HibernateJpaDialect을 다양한 JpaDialect 클래스를 참조) 봄이 무엇을 같이 할 수있는 경우

for (t = e.getCause(); t != null; t = t.getCause()) { 
    logger.debug("Exception:" + t); 
} 

: 다음은 예외의 체인을 인쇄합니다.

이 모든 것이 좋지 않습니다.이 코드는 이식 가능하지 않으며 어떤 속성이 위반을 일으켰는지 찾기가 쉽지 않습니다. 이것으로 아무래도 elegant and portable way to handle constraint violations in JPA이 없음을 확인합니다. 고유 제한 조건을 위반하는 동안

3

롤백의 원인을 조사하려면 e.getCause()을 사용하십시오.

+0

... 'getCause(). getMessag()'를 구문 분석 하시겠습니까? – deamon

+0

그게 무슨 예외에 따라 달라집니다. 그것이 'SQLException'이라면, 오류와 SQLStatus를 확인하십시오. 그러나 Spring과 같은 일부 프레임 워크는이를 좀 더 의미있는 것으로 해석합니다 ('DataIntegrityViolationException'). –

0

스택 추적을 인쇄하면이 사실을 알 수 있다고 생각합니다. e.printStackTrace();

StringWriter writer=new StringWriter(); //remains the message from stack trace. 
e.printStackTrace(new PrintWriter(writer)); 
String message=writer.toString(); // gets the message of full stack trace. 

을 그리고 예외의 정보를 볼 수 :

+0

예외를 수동으로 처리 할 계획이 아닙니다 :-) – deamon

0

이 같이 할 수 있습니다.

+0

좋습니다.하지만 StackTrace를 어떻게해야합니까? 스택 추적으로 문자열을 파싱하는 것은 다소 추한 것이지만, 아마도 유일한 가능성 일 것입니다. – deamon

+1

그리고 어떤 필드가 제약 조건 위반을 일으켰는지 어떻게 알 수 있습니까? – deamon

1

컴파일러는 예외 SQLIntegrityConstraintViolationException에게를 반환합니다.

다음 catch 블록 개념을 사용하여 적절한 예외를 처리하십시오.

catch(SQLIntegrityConstraintViolationException e) 
{ 
    // Error message for integrity constraint violation 
} 
catch(Exception e) 
{ 
// Other error messages 
} 
관련 문제