사용자 도구

사이트 도구


java:hibernate:gotchas

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:hibernate:gotchas [2017/11/30 22:14]
kwon37xi [hashCode와 equals를 항상 구현한다]
java:hibernate:gotchas [2020/01/14 13:21]
kwon37xi [to-many 관계에 대해서 fetch join은 안하는게 낫다]
줄 11: 줄 11:
  
 따라서 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