This question is in response to my earlier question being closed – TRACE logging of org.hibernate.type not seen after changing from WARN to TRACE using Configurator.setLevel
This is my test code:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Query;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Arrays;
import java.util.List;
public class TestLog4j2 {
private static final Logger
logger = LogManager.getLogger(TestLog4j2.class),
hiblogger = LogManager.getLogger("org.hibernate.type");
public static void main(String[] args) {
// Configure Hibernate
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
try {
logger.info("Opened Hibernate session.");
// Begin transaction
session.beginTransaction();
// Create HQL query
String hql = "FROM AmObject WHERE ob_id like ?";
Query query = session.createQuery(hql);
List<?> params = Arrays.asList(new Object[] {"amadmin%"});
for (int i=0; i<params.size();i++) query.setParameter(i, params.get(i));
logger.debug("Created query: " + hql);
// Execute the query and get results
List<?> results = query.list();
hiblogger.trace("size: " + results.size());
// Process the result list
for (Object obj : results) {
AmObject a = (AmObject) obj;
System.out.println("uuid: " + a.getUUID() + ", id: " + a.getId() + ", class: " + a.getObjectClass());
}
// Commit transaction
session.getTransaction().commit();
logger.debug("Transaction committed.");
} catch (Exception e) {
logger.error("An error occurred.", e);
} finally {
session.close();
sessionFactory.close();
logger.info("Session and SessionFactory closed.");
}
}
}
In the test code above, I want to force query.list()
to display TRACE logging for org.hibernate.type.NullableType
similar to the following excerpt from my UAT environment:
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:151) binding 'DefaultJWTProvider' to parameter: 1
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:151) binding 'JWTProvider' to parameter: 2
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:193) returning 'V_42B' as column: ob1_1_0_
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:193) returning 'JWTProvider' as column: ob2_1_0_
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:193) returning '0' as column: ob3_1_0_
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:193) returning 'DefaultJWTProvider' as column: ob4_1_0_
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:187) returning null as column: ob6_1_0_
2024-04-19 09:55:12.482 [http-nio2-8080-exec-2] TRACE - (NullableType.java:193) returning 'DefaultJWTProvider' as column: ob7_1_0_
This is my entity class AmObject
:
public class AmObject {
private String UUID;
private String objectClass;
private long version;
private String id;
// and several other columns
public String getUUID() {
return UUID;
}
public void setUUID(String uUID) {
UUID = uUID;
}
public String getObjectClass() {
return objectClass;
}
public void setObjectClass(String objectClass) {
this.objectClass = objectClass;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
// and the accessors/mutators for the other columns
}
This is my log4j2.properties:
rootLogger=DEBUG, STDOUT
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.hibernateConsole.type = Console
appender.hibernateConsole.name = HIBOUT
appender.hibernateConsole.layout.type = PatternLayout
appender.hibernateConsole.layout.pattern = [HIBERNATE - %-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
logger.TESTMAIN.name = com.myorg.TestLog4j2
logger.TESTMAIN.level = INFO
logger.TESTMAIN.additivity = false
logger.TESTMAIN.appenderRef.rolling.ref = STDOUT
logger.ORG_HIBERNATE_TYPE.name = org.hibernate.type
logger.ORG_HIBERNATE_TYPE.level = TRACE
logger.ORG_HIBERNATE_TYPE.additivity = false
logger.ORG_HIBERNATE_TYPE.appenderRef.rolling.ref = HIBOUT
This is hibernate.cfg.xml
:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Specify dialect -->
<property name="hibernate.dialect">com.myorg.CustomSQL57InnoDBDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Names the XML mapping file -->
<mapping resource="am_object.hbm.xml"/>
</session-factory>
</hibernate-configuration>
This is am_object.hbm.xml
:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.myorg.AmObject" table="am_object">
<id name="UUID" type="string" length="64" column="ob_uuid"/>
<property name="objectClass" type="string" length="32" column="ob_object_class"/>
<property name="version" type="long" column="ob_version"/>
<property name="id" type="string" length="64" column="ob_id" not-null="true"/>
<!-- other columns -->
</class>
</hibernate-mapping>
To repeat my question: how do I force query.list()
to use org.hibernate.type.NullableType
for me to output TRACE log?