2012-11-05 6 views
11

나는 모든 컬럼이 null이 아닌 것으로 정의 된 mysql 테이블에 hibernate를 삽입하려고한다. 고유 기본 키와 여러 개의 고유 색인이 여러 열에 있습니다.org.springframework.dao.DataIntegrityViolationException 오보고가 발생 했습니까?

나는 다음과 같은 오류 받고 있어요 :

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into MY_TABLE(col1, col2, col3, col4, ID_) values (?, ?, ?, ?, ?)]; constraint [null]

이 오류는 고객 로그에 내가이 문제를 자신을 재현 할 수 있습니다, 그래서 값에 무엇을보고 디버깅에 넣을 수 없습니다 insert 문.

"constraint [null]"은 "not null"제약 조건을 위반하고 있음을 의미합니다. 그러나 절전 모드에서 매우 나쁜 버그가 될 것이므로 최대 절전 모드가 null ID를 삽입하려고 시도하지 않는 한, 내 코드를 살펴보면 삽입 할 때 데이터가 null 일 수있는 가능성이있는 방법을 볼 수 없습니다 있을 것 같지 않게).

그러나 고유 한 제약 조건이 위반되는 것을 어떻게 볼 수 있는지 알 수 있습니다. 메시지가 오해의 소지가 있으며 실제로 고유 한 키 위반이 발생할 가능성이 있습니까? "constraint [null]"은 항상 null이 아닌 제약 조건이 위반되었음을 의미합니까? 당신이 스프링 소스 코드 DataIntegrityViolationException의 생성자의 호출자를 검색 할 경우

+0

나는'하지 null' 열이'null' 값을 제공하는 것을 시도하지 않는 한 그 예외가 발생 이유를 추측 할 수없는 등의 DB 이름이 함께 제공됩니다. BTW, 이전 버전의 JDBC 드라이버를 사용하는 경우 최신 버전 (10+)으로 바꾸는 것을 잊지 마십시오. 그렇지 않으면 나중에 다른 문제가 발생합니다. – Lion

+0

이것은 Oracle이 아닌 mysql 5.1입니다. – Dana

답변

11

, 당신은이 org.springframework.orm.hibernate3.SessionFactoryUtils에 불리는 것을 확인할 수있는 것들 :

return new DataIntegrityViolationException(ex.getMessage() + "; SQL [" + jdbcEx.getSQL() + 
       "]; constraint [" + jdbcEx.getConstraintName() + "]", ex); 
그래서 예외가 위반 제약 조건에 의해 발생

null JDBC 예외에 의해 리턴 된 제한 조건의 이름입니다. 따라서 JDBC 예외에서 위반 된 제약 조건 이름을 채우지 않은 MySQL 드라이버를 비난해야합니다. 하지만 위반 된 제약 조건은 제약 조건 일 수 있으며 반드시 not null 제약 조건 일 필요는 없습니다.

+1

나는 mysql이 이름을 알려주지 않고 매우 유용하다는 것을 짜증나게한다! 방금 null이 null 제약 조건을 의미한다고 가정했습니다. 감사. – Dana

1

당신은 Hibernate의 예외 타입으로부터 직접 Constain 이름을 얻을 수있다. 사용

getConstraintName

속성을 사용하면 DB 제한 이름을 얻을 수 있습니다.

} catch (ConstraintViolationException conEx) { 
      if (conEx.getConstraintName().contains("PROJECT_UK")) { 
       //TODO Project Entity is violating it's constrain 

이 앱을 여러 DB 스키마에서 실행하고 싶기 때문에 contains를 사용했습니다. 기본적으로 getConstraintName은

MyDBName.ConstrainName

+0

ConstraintViolationException에 getConstraintName() 메소드가 더 이상 존재하지 않습니다. – Anna

관련 문제