`
longgangbai
  • 浏览: 7328975 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate回调与拦截机制 实战

阅读更多

下面我实现一个利用Interceptor接口实现日志数据稽核的功能,所谓日志数据稽核就是针对一些关键操作进行记录,以便作为业务跟踪的基础依据。

首先定义用于记录操作的实体:

public class AudiLog implements Serializable{

private String id;

private String user;

private String action;

private String entityName;

private String comment;

private Long logtime;

…getter/setter…

}

接下来定义Interceptor接口的实现类和用于持久化操作的AuditDAO类:

package com.lbs.apps.unemployment.subsidy.beforeinfoimport.util;

import net.sf.hibernate.Session;

import net.sf.hibernate.Interceptor;

import java.io.Serializable;

import net.sf.hibernate.type.Type;

import net.sf.hibernate.HibernateException;

import java.util.Iterator;

import java.util.Set;

import java.util.HashSet;

import com.neusoft.entity.User;

public class MyInterceptor implements Interceptor{

private Set insertset=new HashSet();

private Set updateset=new HashSet();

private Session session;

private String userID;

public void setSession(Session session){

    this.session=session

 }

 public void setUserID(String id){

   this.userID=id;

}

public boolean onLoad(Object object, Serializable serializable,

                        Object[] objectArray, String[] stringArray,

                        Type[] typeArray) {

    return false;

}

public boolean onFlushDirty(Object object, Serializable serializable,

                              Object[] objectArray, Object[] objectArray3,

                              String[] stringArray, Type[] typeArray) {

    if(object instanceof User){

      insertset.add(object);

    }

    return false;

}

public boolean onSave(Object object, Serializable serializable,

                        Object[] objectArray, String[] stringArray,

                        Type[] typeArray) {

    if(object instanceof User){

      updateset.add(object);

    }

    return false;

}

public void onDelete(Object object, Serializable serializable,

                       Object[] objectArray, String[] stringArray,

                        Type[] typeArray) {

}

public void preFlush(Iterator iterator) {

}

public void postFlush(Iterator iterator) {

try{

if(insertset.size()>0){

   AuditDAO.dolog(“insert”,userID,inserset,session.connection);

}

if(updateset.size()>0){

   AuditDAO.dolog(“update”,userID,updateset,session.connection);

}

}catch(HibernateException he){

he.printStackTrace();

}

}

public Boolean isUnsaved(Object object) {

    return null;

}

public int[] findDirty(Object object, Serializable serializable,

                         Object[] objectArray, Object[] objectArray3,

                         String[] stringArray, Type[] typeArray) {

    return null;

}

public Object instantiate(Class class0, Serializable serializable) {

   return "";

}

}

public class AuditDAO{

public static void doLog(String action,String userID,Set modifySet,Connection connection){

    Session tempsession=HibernateUtil.getSessionFactory().openSession(connection);

     try{

       Iterator it=modifyset.iterator();

       while(it.hasNext()){

         User user=(User)it.next();

         AudiLog log=new AudiLog();

         log.setUserID(userID);

         log.setAction(action);

         log.setComment(user.toString());

         log.setLogTime(new Long(Calendar.getInstance().getTime().getTime()));

         tempsession.save(log);

       }

     }catch(Exception e){

       throw new CallbackException(e);

     }finally{

       try{

         tempsesson.close();

       }catch(HibernateException he){

         throw new CallbackException(he);

       }

     }

}

}

最后看一下业务逻辑主程序:

SessionFactory sessionfactory=config.buildSessionFactory();

MyInterceptor it=new MyInterceptor();

session=sessionfactory().openSession(it);

it.setUserID(“currentUser”);

it.setSession(session);

User user=new User();

user.setName(“zx”);

Transaction tx=session.beginTransaction();

session.save(user);

tx.commit();

session.close();

以上示例代码中,在创建Session时,设置Interceptor实例对象,当执行到session.save(user)前,会触发onSave()方法,当执行tx.commit()时,会执行flush(),在执行该方法后会触发postFlush()方法,这个方法通过AuditDAO进行持久化保存业务日志,在这个类中的红色部分时有关持久化操作部分,我们并没有使用原有的Session实例,这是因为要避免Session内部状态混乱,因此我们依托当前SessionJDBC Connection创建了一个临时Session用于保存操作记录,在这个持久化操作中没有启动事务,这是因为临时Session中的JDBC Connection是与外围调用InterceptorSession共享,而事务已经在外围SessionJDBC Connection上启动。这是在拦截方法中进行持久化操作的标准方法。总之Interceptor提供了非入侵性的回调拦截机制,使我们可以方便而且优雅的实现一些持久化操作的特殊需求。

分享到:
评论

相关推荐

    深入浅出Hibernate中文版 part1

    5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试...

    深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...

    中文 深入浅出Hibernate

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出Hibernate(PDF)第一部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出Hibernate中文版 part2

    5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试...

    深入浅出Hibernate(PDF)第二部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出hibernate(PDF)第三部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    \深入浅出Hibernate

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出Hibernate2

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    《深入浅出Hibernate》1

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    Hibernate实战(第2版 中文高清版)

     12.3.4 实体监听器和回调   12.4 小结   第13章 优化抓取和高速缓存   13.1 定义全局抓取计划   13.1.1 对象获取选项   13.1.2 延迟的默认抓取计划   13.1.3 理解代理   13.1.4 禁用代理生成   ...

    夏昕.深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...

    Spring3.x企业应用开发实战(完整版) part1

    8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...

    Spring.3.x企业应用开发实战(完整版).part2

    8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...

    RealMadridStore.zip

    模拟支付通常会对接第三方支付平台,如支付宝或微信支付,这部分可能涉及到API调用和回调处理。 后台管理部分,可能包括商品管理、订单管理、用户管理等多个模块。商品管理涉及添加、修改、删除商品,订单管理则...

Global site tag (gtag.js) - Google Analytics