====== 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)