Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Logging Proxy

Wenn man genau hinsieht, ist die SQL-Ausgabe von Hibernate nicht ganz so perfekt, wie man sich das manchmal wünschen würde: Wir sehen leider nicht, welchen Wert Hibernate für den id-Parameter verwendet.

Hibernate:
    select
        customer0_.id as id1_0_0_,
        customer0_.firstname as firstnam2_0_0_,
        customer0_.lastname as lastname3_0_0_
    from
        Customer customer0_
    where
        customer0_.id=?

Manchmal ist das - vor allem wenn man nach Fehlern sucht, nicht besonders hilfreich. Hier kann man zum Beispiel mit einem Proxy in der Datenbankverbindung Abhilfe schaffen:

Dependency
<dependency>
    <groupId>net.ttddyy</groupId>
    <artifactId>datasource-proxy</artifactId>
</dependency>

Diesen Proxy schaltet man zwischen die JDBC-Verbindung zur Datenbank und Hibernate. Es ist etwas Schreibarbeit, da man das nicht direkt über die persistence.xml erreichen kann. Aber es lohnt sich.

PersistenceHelper.java
private static JdbcDataSource dataSource() {
    JdbcDataSource ds = new JdbcDataSource();
    ds.setUser("sa");
    ds.setUrl("jdbc:h2:file:./target/database/db");
    return ds;
}

private static DataSource proxyDataSource() {
    JdbcDataSource ds = dataSource();
    SLF4JQueryLoggingListener queryLoggingListener =
            new SLF4JQueryLoggingListener();
    queryLoggingListener.setLogLevel(SLF4JLogLevel.INFO);
    return ProxyDataSourceBuilder
            .create(ds)
            .name("proxy")
            .listener(queryLoggingListener)
            .build();
}

private static Map<String, Object> properties() {
    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.DATASOURCE, proxyDataSource());
    properties.put(AvailableSettings.HBM2DDL_AUTO, "validate");
    return properties;
}

public static synchronized EntityManagerFactory getEntityManagerFactory() {
    if (emf == null) {
        emf = Persistence.createEntityManagerFactory("default", properties());
    }
    return emf;
}

Nun kann man wirklich ganz genau sehen, was zur Datenbank geschickt wird:

2018-01-27 17:19:13 [main] INFO  n.t.d.l.l.SLF4JQueryLoggingListener - Name:proxy, Time:2, Success:True, Type:Prepared, Batch:False, QuerySize:1, BatchSize:0, Query:["select customer0_.id as id1_0_0_, customer0_.firstname as firstnam2_0_0_, customer0_.lastname as lastname3_0_0_ from Customer customer0_ where customer0_.id=?"], Params:[(1)]