自定义拦截器要实现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;否则返回false10 return false;11 }12 13 @Override14 public void onDelete(Object entity, Serializable id, Object[] state,15 String[] propertyNames, Type[] types) {16 logger.info("删除数据");17 }18 19 @Override20 public boolean onFlushDirty(Object entity, Serializable id,21 Object[] currentState, Object[] previousState,22 String[] propertyNames, Type[] types) {23 logger.info("修改数据");24 //如果修改了持久化对象的状态,返回true;否则返回false25 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.ConsoleAppenderlog4j.appender.appender1.layout=org.apache.log4j.PatternLayoutlog4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%c] %m%nlog4j.appender.appender2=org.apache.log4j.FileAppenderlog4j.appender.appender2.layout=org.apache.log4j.PatternLayoutlog4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss}][%c] %m%nlog4j.appender.appender2.File=HongtenLog4j.log
请参考:一文。