在Hibernate中開啟日誌,Hibernate開啟日誌
在Hibernate中開啟日誌
作者:chszs,轉載需註明。部落客頁:http://blog.csdn.net/chszs
在項目中,如果要排查故障,找出Bug,離不開日誌資訊。那麼在Hibernate項目中如何開啟日誌輸出呢?本文講述如何在Hibernate中開啟日誌,以及Hibernate的記錄層級。
一、項目開發環境
具體以一個樣本項目為例,我們的項目使用了:
二、依賴關係
樣本項目使用了以下的開源庫,包括:
1. hibernate-core
ORM持久化的核心庫
2. mysql-connector-java
MySQL的JDBC驅動包
3. slf4j-api
供Hibernate使用的簡單日誌Facade
4. slf4j-log4j12
Hibernate使用的日誌輸出庫
5. javassist
Hibernate使用的Java位元組碼操作庫
Hibernate依賴於抽象日誌架構SLF4J,使用SLF4J後,可以選擇多種日誌輸出架構。如果項目未綁定任何日誌輸出架構,那麼它是沒有任何輸出的。故本樣本項目綁定了Log4j作為日誌輸出架構。
三、配置Log4j
在項目的類路徑下,建立log4j.properties檔案,內容如下:
# Root logger optionlog4j.rootLogger=INFO, consolelog4j.logger.com.ch.demo=INFO, console# Direct log messages to consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n# direct messages to file hibernate.loglog4j.logger.org.hibernate=DEBUG, hibernatelog4j.appender.hibernate=org.apache.log4j.RollingFileAppenderlog4j.appender.hibernate.File=hibernate.loglog4j.appender.hibernate.layout=org.apache.log4j.PatternLayoutlog4j.appender.hibernate.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n
上面的log4j.properties設定檔中,我們指定所有的Hibernate的具體資訊輸出類別為hibernate.log。它用於org.hibernate包。如果只想輸出部分Hibernate類別的資訊,那麼需要對指定類別進行配置。
Hibernate主要的類別如下:
1)org.hibernate.SQL
日誌輸出所有Hibernate執行的SQL DML語句
2)org.hibernate.type
日誌輸出所有的JDBC參數
3)org.hibernate.transaction
日誌輸出所有活動相關的事務
4)org.hibernate.jdbc
日誌輸出所有的JDBC資源採集
5)org.hibernate.tool.hbm2ddl
日誌輸出所有Hibernate執行的SQL DDL語句
6)org.hibernate
日誌輸出所有的Hibernate資訊
如果指定日誌輸出類別為org.hibernate.SQL,那麼將會輸出SQL語句。但是,還有一種更簡單的查看SQL語句的方法,只需簡單地設定show_sql參數為true。
四、Hibernate日誌樣本1、建立實體Bean:Order
package com.ch.demo.hibernate;import java.util.Date;public class Order { private Long orderId; private String orderNbr; private Date orderDate; private String orderDesc; private Long orderQty; public Order() { } public Order(String orderNbr) { this.orderNbr = orderNbr; } public Long getOrderId() { return orderId; } private void setOrderId(Long orderId) { this.orderId = orderId; } public Date getOrderDate() { return orderDate; } public void setOrderDate(Date orderDate) { this.orderDate = orderDate; } public String getOrderDesc() { return orderDesc; } public void setOrderDesc(String orderDesc) { this.orderDesc = orderDesc; } public Long getOrderQty() { return orderQty; } public void setOrderQty(Long orderQty) { this.orderQty = orderQty; } public String toString() { return "Order: nbr[" + orderNbr + "] date [" + orderDate + "] desc[" + orderDesc + "] qty[" + orderQty + "]"; }}
2、建立ORM對應檔:orders.hbm.xml
<!DOCTYPE hibernate-mappingPUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ch.demo.hibernate"> <class name="com.ch.demo.hibernate.Order" table="orders"> <id name="orderId" column="order_id"> <generator class="native" /> </id> <property name="orderNbr" column="order_nbr" type="string" length="30" access="field"/> <property name="orderDesc" column="order_desc" type="string" length="60" /> <property name="orderDate" type="timestamp" column="order_date"/> <property name="orderQty" column="qty" type="long" /> </class></hibernate-mapping>
3、操作資料庫的範例程式碼:HibernateLoggingExample.java
package com.ch.demo.hibernate;import java.io.IOException;import java.util.Date;import java.util.List;import org.hibernate.MappingException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class HibernateLoggingExample { public static void main(String[] args) throws MappingException, IOException { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); Transaction tx = session.getTransaction(); tx.begin(); Query query = session.createQuery("from Order where orderNbr='ORD01'"); List list = query.list(); System.out.println("Orders found: " + list.size()); for(Order order: list) { session.delete(order); System.out.println("Deleted " + order); } tx.commit(); session = sessionFactory.getCurrentSession(); tx = session.getTransaction(); tx.begin(); Order order = new Order("ORD01"); order.setOrderDesc("Laptop"); order.setOrderQty(2L); order.setOrderDate(new Date()); session.save(order); tx.commit(); session = sessionFactory.getCurrentSession(); tx = session.getTransaction(); tx.begin(); query = session.createQuery("from Order where orderNbr='ORD01'"); System.out.println("List all orders: " + query.list()); tx.commit(); sessionFactory.close(); }}
4、日誌輸出
19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cfg.beanvalidation.BeanValidationIntegrator].19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.secure.spi.JaccIntegrator].19:14| DEBUG | IntegratorServiceImpl.java 46 | Adding Integrator [org.hibernate.cache.internal.CollectionCacheInvalidator]....19:14| DEBUG | LocalXmlResourceResolver.java 74 | Recognized legacy hibernate-mapping identifier; attempting to resolve on classpath under org/hibernate/19:14| DEBUG | MappingBinder.java 53 | Performing JAXB binding of hbm.xml document : Origin(name=orders.hbm.xml,type=RESOURCE)19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration java.lang.Boolean -> org.hibernate.type.BooleanType@55f616cf...19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors19:14| DEBUG | QueryTranslatorImpl.java 246 | HQL: from com.ch.demo.hibernate.Order where orderNbr='ORD01'19:14| DEBUG | QueryTranslatorImpl.java 247 | SQL: select order0_.order_id as order_id1_0_, order0_.order_nbr as order_nb2_0_, order0_.order_desc as order_de3_0_, order0_.order_date as order_da4_0_, order0_.qty as qty5_0_ from orders order0_ where order0_.order_nbr='ORD01'19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors...19:14| DEBUG | SqlStatementLogger.java 92 | delete from orders where order_id=?Hibernate: delete from orders where order_id=?...19:14| DEBUG | SqlStatementLogger.java 92 | insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)Hibernate: insert into orders (order_nbr, order_desc, order_date, qty) values (?, ?, ?, ?)