我一直非常成功地使用Hibernate,但今天我发现了一个与日志记录有关的奇怪现象.如果我为下面的类打开日志(在"调试"级别)org.hibernate
(例如org.hibernate.SQL
或org.hibernate.impl.SessionImpl
),我会得到两个对应于这些类的每个日志行两次.我从来没有看到任何其他包的记录.
这是日志输出的摘录.第一行和第四行是我的,其他是Hibernate的:
23:54:45,472 TRACE UserDaoImpl:37 - Loading User by id: 2 23:54:45,473 DEBUG SQL:401 - select user0_.id as id22_2_, user0_.avatar as avatar22_2_, ... 23:54:45,473 DEBUG SQL:401 - select user0_.id as id22_2_, user0_.avatar as avatar22_2_, ... 23:54:45,499 TRACE PropertyDaoImpl:40 - Loading class com.myapp.locale.Region with ID 21 23:54:45,503 DEBUG SQL:401 - select region0_.id as id19_1_, region0_.code as code19_1_, ... 23:54:45,503 DEBUG SQL:401 - select region0_.id as id19_1_, region0_.code as code19_1_, ...
来自数据库一侧的证据表明,每个命令只发送一次(幸运的是!).
我使用Hibernate-Annotations 3.3.1.GA
和PostgreSQL JDBC连接器5.0.7
和log4j 1.2.14
我只能想到:
检查你的log4j配置是否没有在不同级别定义多个appender?如果您将appender连接到org.hibernate记录器,并再次附加到org.hibernate.SQL记录器,那么您将看到两次(除非您关闭较低级别记录器的可加性).
您没有在SessionFactory上设置hibernate.show_sql属性?这不会启用log4j的日志记录(你通过log4j配置执行),它只是转储到控制台.如果你的log4j也正在转储到控制台,你会看到它两次.但是,这看起来像一个log4j格式的日志行,而不是hibernate完成的控制台转储,所以这似乎不太可能.值得一提的是.