Prepared Statement Parameter von Hibernate ausgeben lassen
Wer mit Hibernate arbeitet dem fällt früher oder später auf, dass die eingesetzten Parameter bei ausgeführten SQL Statements nicht im Logfile (oder auf der Konsole) zu sehen sind. Vielmehr sehen die SQL Statements zum Beispiel wie folgt aus:
21:10:03,406 INFO [STDOUT] Hibernate: insert into REGISTERED_USER (version, NAME, USER_TYPE, CONF_FK, id) values (?, ?, ?, ?, ?)
Das für den Entwickler eigentlich interessante, nämlich die Parameter in der values Zeile, wird wegen der Verwendung von Prepared Statements nur durch Fragezeichen ausgegeben.
Die allgemein gültige Lösung dafür ist das Log Level für Hibernate Kategorie org.hibernate.type auf TRACE zu setzen. In einer log4j.properties Datei reichen die folgenden beiden Angaben um die SQL Statements sowie deren Paramter im Log auszugeben:
log4j.logger.org.hibernate.type = TRACE
Arbeitet man mit der log4j.xml Konfigurationsdatei muss man die Kategorie wie folgt konfigurieren:
<category name="org.hibernate.type"> <priority value="TRACE"/> <appender-ref ref="CONSOLE"/> </category>
Die Kategorie org.hibernate.SQL muss man nicht unbedingt konfigurieren wenn man in der Hibernate Konfiguration, die bei der Nutzung von JPA in der Datei persistence.xml zu finden ist, den Parameter hibernate.show_sql auf true setzt:
<property name="hibernate.show_sql" value="true"/>
Überschreibt man die in der log4j Konfiguration die Kategorie org.hibernate.SQL hat diese Einstellung in der persistence.xml keine Wirkung.
Arbeitet man mit JBoss Seam unter dem JBoss AS verhält es sich grundsätzlich genauso wie oben beschrieben:
- Konfiguration des show_sql Flags auf den Wert true in der persistence.xml
- Die Log4J Konfiguration für Hibernate erweitern: Im JBoss AS Installationsordner unter <JBossAs>\server\default\conf die Datei jboss-log4j.xml editieren und die Hibernate Kategorie org.hibernate.type wie oben beschrieben hinzufügen
Da hier das Log Level auf TRACE gesetzt wird muss man das Level für den Appender auch auf TRACE setzen um den entsprechenden Effekt zu erhalten. Es ist nicht unbedingt ratsam den Default Appender, hier CONSOLE auf TRACE zu setzen weil sonst alle für diesen Appender konfigurierten Kategorien viel und laut sprechen.
Es bietet sich stattdessen an einen eigenen Hibernate Appender zu erstellen und nur diesen auf TRACE zu setzen. Bei mir sieht die jboss-log4j.xml für Hibernate wie folgt aus. Zuerst der Hibernate Appender:
<appender name="HIBERNATE" class="org.apache.log4j.ConsoleAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Target" value="System.out"/> <param name="Threshold" value="TRACE"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> </layout> </appender>
Die Hibernate org.hibernate.type Kategorie Konfiguration:
<category name="org.hibernate.type"> <priority value="TRACE"/> <appender-ref ref="HIBERNATE"/> </category>
Eigentlich ziemlich simpel.
Führt man nun das am Anfang beschriebene SQL Statement nochmal aus ist auf der Konsole folgendes zu sehen:
21:30:11,756 INFO [STDOUT] Hibernate: insert into REGISTERED_USER (version, NAME, USER_TYPE, CONF_FK, id) values (?, ?, ?, ?, ?) 21:30:11,756 TRACE [IntegerType] binding '0' to parameter: 1 21:30:11,756 TRACE [StringType] binding 'Markus' to parameter: 2 21:30:11,756 DEBUG [EnumType] Binding 'ADMIN' to parameter: 3 21:30:11,756 TRACE [LongType] binding '41' to parameter: 4 21:30:11,756 TRACE [LongType] binding '41' to parameter: 5
Und kaum hat man diese wenigen Konfigurationselemente hinzugefügt spricht Hibernate schon eine viel deutlichere und schönere Sprache für uns.
Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.














Eine nette Alternative zum Loggen von SQL-Statements bei Anwendungen mit dynamisch generiertem SQL sind auch loggende JDBC-Wrapper wie z.B. http://log4jdbc.sourceforge.net