Hibernate show_sql未记录发送至DB2的真实查询问题
首先明确原因:当Hibernate处理DB2的IDENTITY类型主键时,为了同步获取插入后生成的ID,DB2方言会自动将原始INSERT语句改写为包含FINAL TABLE的SELECT语句(格式为INSERT ... SELECT * FROM FINAL TABLE (...))。而Hibernate的show_sql仅打印它生成的原始语句,不会显示方言/驱动改写后的最终执行SQL。
以下是无需参数拦截器的解决方案:
开启DB2 JDBC驱动的SQL日志
这是最直接的方式,DB2 Type 4驱动支持通过连接URL参数记录实际发送到数据库的所有SQL:
在JDBC连接URL中添加traceLevel=4(仅记录SQL语句)或traceLevel=-1(记录所有JDBC操作),同时指定日志文件路径:jdbc:db2://your-host:your-port/your-db:traceLevel=4;traceFile=/var/log/db2_jdbc_sql.log;注意:此方式在生产环境需谨慎启用,会带来一定性能开销,且日志文件增长较快,测试完成后建议关闭。
调整Hibernate日志配置(辅助验证)
虽然无法直接看到改写后的SQL,但可以通过日志框架(如Logback、Log4j2)将org.hibernate.SQL的日志级别设为DEBUG,同时开启hibernate.format_sql=true,这样能更清晰地看到Hibernate生成的原始语句,配合驱动日志对比差异。修改主键生成策略(可选,需业务适配)
如果业务允许不同步获取生成的ID,可以考虑改用SEQUENCE主键生成策略,此时Hibernate不会触发DB2的FINAL TABLE改写逻辑,show_sql打印的语句会和DB2接收的一致。但此方案仅适用于业务场景允许的情况。
内容的提问来源于stack exchange,提问作者ekalin

