====== Hibernate 4 ====== * [[http://java.dzone.com/articles/hibernate-%E2%80%93-please-dont|Hibernate 4 JSE 구동 코드]] * [[http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/|Spring 3.1 and Hibernate 4.1]] * [[http://www.javacodegeeks.com/2013/05/hibernate-4-with-spring.html|Hibernate 4 with Spring]] ===== 문제점 ===== ==== Statement 2중 close 문제 ==== ** 최신 버전에서는 4.2.x, 4.3.x 모두 해결된 상태이다.** 현재 4.2.15버전에서 Comoposite Key 사용시에 Insert 등의 작업시에 closed statement에 대해 getWarnings를 호출하는 문제가 있어보인다. 예외를 잡아서 debug로그로 남기고 그냥 넘어가기 때문에 실질적인 문제는 안되지만 성능상 안 좋아보인다. [[https://hibernate.atlassian.net/browse/HHH-9174|HHH-9174]] 로그 레벨을 체크하여 필요할 경우에만 로그를 찍게 수정되었다. 그러나 근본적인 문제는 Statement가 이미 close 된 상태에서 아래 메소드를 호출한다는 점이다. ''org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch#addToBatch.addToBatch''에서 statement를 두번 release 한다. [[https://hibernate.atlassian.net/browse/HHH-8952|HHH-8952 NonBatchingBatch releases statements twice]] -> [[https://hibernate.atlassian.net/browse/HHH-8853|Hibernate 4.3.2에서 수정됨]] 그러나 4.2.x 에서는 그대로 남아있는 상태. org.hibernate.engine.jdbc.spi.SqlExceptionHelper#handleAndClearWarnings(java.sql.Statement, org.hibernate.engine.jdbc.spi.SqlExceptionHelper.WarningHandler) // See HHH-9174. Statement#getWarnings can be an expensive call for many JDBC libs. Don't do it unless // the log level would actually allow a warning to be logged. if (LOG.isEnabled(Level.WARN)) { try { walkWarnings(statement.getWarnings(), handler); } catch (SQLException sqlException) { // workaround for WebLogic LOG.debug("could not log warnings", sqlException); } } 4.2버전에서 단기 해결책은 로그 레벨을 ERROR로 변경하는 것이다. // logback의 경우 logger('org.hibernate.engine.jdbc.spi.SqlExceptionHelper', ERROR)