自定义拦截器要实现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使用总结一文。