Hibernate: @Where Clause 문서와 같이 Hibernate에서 제공하는 @Where를 사용해 문제를 해결하는 경우가 있다.
Hibernate: @Where Clause 문서의 예로 들고 있듯이 "soft delete" 문제를 해결하기 위해 테이블에 삭제 여부를 추가하는 경우 특히 유용하다.
slipp.net 또한 답변글을 보여줄 때 @Where를 활용해 해결했다.
@OneToMany(mappedBy = "question", fetch = FetchType.LAZY)
@Where(clause = "deleted = 'false'")
@OrderBy("answerId ASC")
private List<Answer> answers;
위와 같이 문제를 해결했는데 에러 로그를 확인해보니 다음과 같은 warning 메시지가 출력되는 이슈가 생겼다.
15:20:45.523 [WARN ] [http-nio-7070-exec-17] [o.h.e.jdbc.spi.SqlExceptionHelper] - Truncated incorrect DOUBLE value: 'false'
15:20:45.526 [WARN ] [http-nio-7070-exec-17] [o.h.e.jdbc.spi.SqlExceptionHelper] - SQL Warning Code: 1292, SQLState: 22007
원인을 파악해 보니 @Where 설정에 deleted = 'false'와 같이 설정한 이유 때문이다. 그래서 위 설정을 deleted = false로 수정했더니 완전히 다른 에러가 발생한다.
이 문제를 해결하기 위해 다시 원복하고 다른 방법을 찾으려다 다음과 같이 간단한 방법으로 해결했다.
@OneToMany(mappedBy = "question", fetch = FetchType.LAZY)
@Where(clause = "deleted = 0")
@OrderBy("answerId ASC")
private List<Answer> answers;
deleted = 0으로 수정했다. 100% 마음에 드는 해결책은 아니지만 warning 메시지도 사라졌고, 기능도 정상적으로 동작한다.
이와 관련해서는 Handling soft-deletes with Spring JPA 글에서도 참고할 수 있다.
0개의 의견 from SLiPP
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.