페이지

2013년 9월 12일 목요일

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp

Caused by: org.hibernate.exception.GenericJDBCException: could not load an entity: [classpath#133]

Caused by: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp

 하이버네이트에서 mysql 의 datetime 형 컬럼의 값이 0일 때 Date형으로 파싱하지 못하고 뿌리는 에러입니다.

 컬럼에 null을 허용하고 하이버네이트를 이용한 접근만 있었다면 테이블에 0값이 들어갈 일은 없을 겁니다.

 제경우는 mysql5.6 버전으로 업그레이드하면서 new Date() 로 설정된 값이 디비에 업데이트시 제대로 된 값을 저장하지 못하고 0값('0000-00-00 00:00:00')을 입력하는 현상이 발생하였습니다.

 대략 코드로 표현하면 아래와 같은 식입니다.

@Entity
@Table(name = "table1")
public class Bean1 {
    @Column(name = "date1")
    private Date date1;
    ...
}

bean1.setDate1(new Date());
dao.update(bean1);

 아래와 같이 new Date() 대신 SimpleDateFormat으로 조정을 해서 넣으면 또 저장이 되긴했습니다.

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(format.format(new Date()));
bean1.setDate1(date);

 근본적인 해결책은 아니라는 생각에 mysql connector/J 를 최신버전으로 바꿔보니 정상적으로 작동하였습니다.

 결론은 mysql업그레이드 시에는 mysql connector 도 함께 업그레이드 하는 것이 좋습니다. connector도 버전간에 기능이 달라지는 경우가 있으니 주의해야 합니다.

댓글 없음:

댓글 쓰기