사용자 도구

사이트 도구


java:hibernate:gotchas

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:hibernate:gotchas [2017/11/30 22:13]
kwon37xi [hashCode와 equals를 항상 구현한다]
java:hibernate:gotchas [2020/01/14 13:21]
kwon37xi [to-many 관계에 대해서 fetch join은 안하는게 낫다]
줄 8: 줄 8:
 이유는 Set등에 신규 객체를 넣을 경우 신규 객체는 아직 프라이머리키가 지정되지 않은 상태이기 때문에 ID가 모두 ''null'' 혹은 ''0''이며 이 경우 Set에 저장할 때 equals가 항상 true 여서 이전의 값을 뒤에 저장한 값이 계속 덮어써버리는 현상이 발생하기 때문이다. 이유는 Set등에 신규 객체를 넣을 경우 신규 객체는 아직 프라이머리키가 지정되지 않은 상태이기 때문에 ID가 모두 ''null'' 혹은 ''0''이며 이 경우 Set에 저장할 때 equals가 항상 true 여서 이전의 값을 뒤에 저장한 값이 계속 덮어써버리는 현상이 발생하기 때문이다.
  
-하지만 실제로 해보면 인공키를 hashCode의 기준으로 삼을 수 밖에 없는 경우도 많다. 조심해야 한다.+하지만 실제로 해보면 인공키를 hashCode의 기준으로 삼을 수 밖에 없는 경우도 많다. Set/Map 과 함께 사용할 때 주의를 기울여야한다.
  
 따라서 ID를 equals/hashCode의 기준으로 삼을 경우 매우 주의해야 한다. 관련 참조 - [[http://community.jboss.org/wiki/EqualsAndHashCode|Hibernate equals and hashCode]] 따라서 ID를 equals/hashCode의 기준으로 삼을 경우 매우 주의해야 한다. 관련 참조 - [[http://community.jboss.org/wiki/EqualsAndHashCode|Hibernate equals and hashCode]]
 +
 +===== to-many 관계에 대해서 fetch join은 안하는게 낫다 =====
 +  * to-many 관계에 대해서 fetch join 을 하면 부모측이 자식측(many)의 갯수만큼 중복으로 결과 갯수가 늘어난다.
 +  * 이를 해결하려면 ''distinct'' 를 꼭 해야한다.
 +  * to-many 관계에 대해서 ''limit'' 을  걸게 되면 그 일반 SQL에서는 자식의 갯수에 대한 limit 이 돼 버린다. 이렇게 되면 실제 조회를 원하는 데이터(parent)의 갯수가 의도대로 나오지 않게 된다.
 +    * 때문에 하이버네이트는 SQL에 limit을 걸리 않고 limit 없이 전체 데이터를 조회한 뒤에 메모리에서 parent 데이터를 원하는 limit 갯수만큼 끊어서 반환한다.
 +    * 이는 엄청난 성능저하로 이어진다.
 +  * 결과적으로 특별한 이유가 없다면 **to-many 관계에 대해서는 fetch join을 하지 말고 항상 ''Hibernate.initialize()'' 등으로 초기화를 하되 batch size 를 지정하는 식으로 한다.**
 +    * [[java:hibernate:performance|Hibernate Performance Tuning]] ''hibernate.default_batch_fetch_size=30''
  
 ===== One-To-One 과 Many-To-One 관계를 조심하라 ===== ===== One-To-One 과 Many-To-One 관계를 조심하라 =====
줄 32: 줄 41:
 항상 **템플릿 엔진의 주석(JSP의 경우 <%-- --%>)을 사용하라.** 항상 **템플릿 엔진의 주석(JSP의 경우 <%-- --%>)을 사용하라.**
  
-===== 쿼리 로그를 남겨라 =====+===== 개발 환경에서는 쿼리 로그를 남겨라 =====
 <code properties> <code properties>
 hibernate.show_sql=true hibernate.show_sql=true
줄 40: 줄 49:
 [[java:hibernate:log|Hibernate Log 남기기]]를 참조한다. [[java:hibernate:log|Hibernate Log 남기기]]를 참조한다.
  
 +단, 실 운영환경에서는 로그를 남기는 순간 매우 느려지므로 로그 레벨을 높여야 한다.
 ===== 쿼리에 진짜로 ":"로 들어간다면? ===== ===== 쿼리에 진짜로 ":"로 들어간다면? =====
 Native SQL에 '':''를 넣어야 할 필요가 있다면 Escape을 해줘야 한다. Native SQL에 '':''를 넣어야 할 필요가 있다면 Escape을 해줘야 한다.
java/hibernate/gotchas.txt · 마지막으로 수정됨: 2023/07/03 14:54 저자 kwon37xi