在Hibernate中开启日志

127 篇文章 1 订阅
80 篇文章 2 订阅

在Hibernate中开启日志

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

在项目中,如果要排查故障,找出Bug,离不开日志信息。那么在Hibernate项目中如何开启日志输出呢?本文讲述如何在Hibernate中开启日志,以及Hibernate的日志级别。

一、项目开发环境

具体以一个示例项目为例,我们的项目使用了:

  1. Maven 3.2.3
    http://maven.apache.org/
  2. Hibernate 5.0.0.CR1 RELEASE
    http://hibernate.org/orm/
  3. Eclipse IDE,版本为Luna 4.4.1
    http://www.eclipse.org/

二、依赖关系

示例项目使用了以下的开源库,包括:
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 option
log4j.rootLogger=INFO, console
log4j.logger.com.ch.demo=INFO, console

# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n

# direct messages to file hibernate.log
log4j.logger.org.hibernate=DEBUG, hibernate
log4j.appender.hibernate=org.apache.log4j.RollingFileAppender
log4j.appender.hibernate.File=hibernate.log
log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
log4j.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-mapping
PUBLIC "-//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@55f616cf
19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration boolean -> org.hibernate.type.BooleanType@55f616cf
19:14| DEBUG | BasicTypeRegistry.java 130 | Adding type registration java.lang.Boolean -> org.hibernate.type.BooleanType@55f616cf
...
19:14| DEBUG | ErrorCounter.java 95 | throwQueryException() : no errors
19: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 (?, ?, ?, ?)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 背景 一民营企业专业从事灯具照明行业,是某灯具的南京地区总代理,主要在南京负责品牌的推广及项目的落地销售、分销的批发等工作,服务对象包括项目业主、施工单位、分销商、设计院、终端用户等。 <br /> 现公司规模扩大,企业业务量、办公场所、员工数都发生增长,为适应新的环境,提高工作效率和用户满意度, 该公司聘请公司S开发一套进销存系统。 <br /> 软件工程与计算二大作业---民营灯具企业进销存系统后端 ### 技术简介 本项目采用SpringBoot作为框架。 * 数据持久层使用SpringBoot自带的Hibernate来维护PO(Persistent Object持久化对象),这里使用Hibernate的原因在于其三种对象状态(持久态、游离态、分割态)便于持久化对象的增删改查等一系列操作,取代了jdbc的繁琐。 * Dao层(Data Access Object数据访问对象)使用Spring Data JPA来维护数据读写操作,Spring Data JPA的底层是基于Hibernate的,其JpaRepository、PageAndSortingRepository、CrudRepository等组件能够实现快速单表读取与后端分页、排序等功能,所以其便捷性很适合单体式系统的开发。 * 权限管理使用Apache Shiro框架:Shiro具备身份认证、会话管理、授权等功能,具备单点登录(SSO),而且本身足够轻量,易于理解,在保证完善的安全机制的同时简化开发成本。 * 日志管理使用Log4j,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件,方便在开发环境于控制台监控程序运行状况,生产环境收集日志按时间汇总成文件形式。 * 数据库使用MySQL,MySQL的关系型数据库特性使得数据的增删改查更灵活,并且其对于Java语言的支持度非常高。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
/** * YDL_Hibernate概要 <br/> * (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类的注解字段也支持自动建表. 2.自动支持增删改 * ,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate的对象化操作. * 3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式. * 4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架. * 5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目很实用,且效率更好些. * 6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数. <br/> * (二)不足之处: <br/> * 1.id暂时只支持int类型,不支持uuid,在sqlite不建议用uuid. * 2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务做多个操作然后统一提交事务. <br/> * (三)作者寄语:<br/> * 昔日有JavaScript借Java发展,今日也希望AHibernateHibernate之名发展. * 希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利. * 欢迎访问我的博客:http://blog.csdn.net/linglongxin24, * 这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动国开源事业的发展,YDL_Hibernate期待与您共创美好未来!!! */

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值