zoukankan      html  css  js  c++  java
  • Hibernate_拦截器与日志文件

    自定义拦截器要实现Interceptor接口,拦截器也是用观察者模式来设计的,重写Interceptor里面的方法,在特定条件下,这些方法就会被调用。

    在Interceptor对象的方法中不能直接使用Session对象执行持久化操作,如果需要在拦截的同时使用Session对象完成持久化,可以使用Hibernate中事件监听.

    下面举例拦截器,将数据的增,删,改信息保存到日志文件中,其中要用到log4j.

    编写自定义拦截器LogInterceptor.java:

     1 public class LogInterceptor extends EmptyInterceptor {
     2     //对LogInterceptor这个类的日志进行处理
     3     private Logger logger = Logger.getLogger(LogInterceptor.class);
     4     
     5     @Override
     6     public boolean onSave(Object entity, Serializable id, Object[] state,
     7             String[] propertyNames, Type[] types) {
     8         logger.info("保存数据");
     9         //如果修改了持久化对象的状态,返回true;否则返回false
    10         return false;
    11     }
    12     
    13     @Override
    14     public void onDelete(Object entity, Serializable id, Object[] state,
    15             String[] propertyNames, Type[] types) {
    16         logger.info("删除数据");
    17     }
    18     
    19     @Override
    20     public boolean onFlushDirty(Object entity, Serializable id,
    21             Object[] currentState, Object[] previousState,
    22             String[] propertyNames, Type[] types) {
    23         logger.info("修改数据");
    24         //如果修改了持久化对象的状态,返回true;否则返回false
    25         return false;
    26     }
    27 }

     拦截器的加载可以在解析配置文件之前进行加载,也可以在打开Session的时候进行加载:

    在解析配置文件配置文件之前加载:

     1 static {
     2         Configuration cfg = null;
     3         // 解析配置文件
     4         try {
     5             cfg = new Configuration();
     6             //在解析配置文件时加载过滤器
     7             cfg.setInterceptor(new LogInterceptor());
     8             cfg.configure();
     9         }
    10         catch (Exception e) {
    11             e.printStackTrace();
    12         }
    13         factory = cfg.buildSessionFactory();
    14     }

    在打开Session的时候进行加载:

    1      Configuration cfg = new Configuration();
    2         cfg.configure();
    3         SessionFactory factory = cfg.buildSessionFactory();
    4         Session session = factory.openSession(new LogInterceptor());
    5         Transaction ts = session.beginTransaction();

     注意:在打开Session的时候进行拦截器加载,这个拦截器只在当前session中有效.

     

    配置log4j.properties:

    log4j.rootLogger=info,appender1,appender2
    log4j.appender.appender1=org.apache.log4j.ConsoleAppender
    log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
    log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%c] %m%n
    log4j.appender.appender2=org.apache.log4j.FileAppender
    log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
    log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss}][%c] %m%n
    log4j.appender.appender2.File=HongtenLog4j.log

     

    请参考:Log4j使用总结一文。

     

    一颗平常心,踏踏实实,平静对待一切
  • 相关阅读:
    给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&Comparator接口
    给jdk写注释系列之jdk1.6容器(8)-TreeSet&NavigableMap&NavigableSet源码解析
    给jdk写注释系列之jdk1.6容器(7)-TreeMap源码解析
    给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器
    给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析
    给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析
    给jdk写注释系列之jdk1.6容器(3)-Iterator设计模式
    给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析
    给jdk写注释系列之jdk1.6容器(1)-ArrayList源码解析
    留言板
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2664407.html
Copyright © 2011-2022 走看看