Caused by: java.lang.NoSuchFieldError: TRACE
at org.jboss.logging.Log4jLogger.translate(Log4jLogger.java:64)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1311)
...
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(...)
Hibernate 4 依賴 JBoss Logging API,但運行時類路徑中存在多個版本的 jboss-logging.jar 或 log4j.jar,導致 TRACE 級別常量缺失。 具體常見於:
hibernate-jpa-2.1-api、jboss-logging、log4j、slf4j-log4j12 等,版本不協調。LocalSessionFactoryBean 初始化時,Hibernate 內部調用 JBoss Logging 的 Logger.trace(),但加載的 Log4jLogger 類找不到 TRACE 字段。log4j、commons-logging、jboss-logging 传递依赖。logback-classic、slf4j-api、jcl-over-slf4j、log4j-over-slf4j。jboss-logging 版本為 3.1.x(Hibernate 4.x 兼容),並確保 log4j:log4j:1.2.17 單一版本。
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.4.GA</version>
</dependency>
LocalSessionFactoryBean 配置正確,數據源、包掃描、方言無誤。mvn dependency:tree -Dverbose | grep -E "jboss-logging|log4j|slf4j"
# 看是否有多版本共存,用 排除傳遞依賴
NoSuchFieldError: TRACE 典型為 **JBoss Logging 與 Log4j 版本衝突**。徹底清理傳遞依賴,統一為 SLF4J+Logback 或鎖定兼容版本,即可解決。Spring 整合 Hibernate 4 時,日誌依賴管理是必修課。