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

hibernate的拦截器(Interceptor)

阅读更多
拦截器(Interceptor)
org.hibernate.Interceptor接口定义了Hibernate中通用拦截机制
创建Session对象的时候,所有的Session对象或者这个Session对象的所有持久化操作的动作都会被指定的拦截器进行拦截.


Interceptor接口的方法

    afterTransactionBegin()
    当一个事务时候启动时,会立刻调用这个方法,这个方法可以改变这个事务的状态,例如:回滚事务
    instantiate()
    创建对象,如果返回null,则Hibernate将调用实体类的默认构造方法创建持久化对象
    getEntity()
    当一个持久化对象,通过标示符属性在Session对象的缓存中进行查找,并且没有找到时,会调用该方法
    getEntityName()
    当session对象获取持久化对象的名字时,会调用这个方法
    onLoad()
    该方法在持久化对象初始化之前加载,这个的持久化对象处于刚被创建的状态(对象的属性值都未赋值)
    findDirty()
    当调用Session对象的flush()方法时,讲调用该方法判断对象是否为脏数据,这是脏数据检查的另外拦截的实现方式
    isTransient()
    当调用Session对象的saveOrUpdate方法时,会调用该方法判断对象是否尚未保存
    onSave()
    在对象被保存之前调用,通过这个方法可以对要保持的对象的属性进行修改
    onDelete()
    该方法在持久化对象被删除之前调用
    preFlush()
    该方法当调用Session对象的flush()方法之前被调用
    onFlushDirty()
    当调用Session对象flush()方法进行脏数据检查时,如果发现持久化对象的状态发生了改变,会调用该方法
    postFlush()
    该方法调用Session对象的flush()方法之后被调用
    beforeTransactionCompletion()
    在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务
    afterTransactionCompletion()
    当完成一个事务之后,立刻调用此方法

1、使用拦截器实现操作日志
在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间


Java代码  收藏代码

    import org.hibernate.CallbackException; 
    import org.hibernate.EmptyInterceptor; 
    import org.hibernate.type.Type; 
     
    import java.io.Serializable; 
    import java.util.Date; 
     
     
    public class DaoLogInterceptor extends EmptyInterceptor { 
     
        private static final long serialVersionUID = 1L; 
     
        @Override 
        public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
            super.onDelete(entity, id, state, propertyNames, types); 
        } 
     
        @Override 
        public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
            return super.onSave(entity, id, state, propertyNames, types); 
        } 
     
        @Override 
        public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException { 
            super.onCollectionUpdate(collection, key); 
        } 
     
        @Override 
        public void onCollectionRemove(Object collection, Serializable key) throws CallbackException { 
            super.onCollectionRemove(collection, key); 
        } 
     
        @Override 
        public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
            return super.onLoad(entity, id, state, propertyNames, types); 
        } 
     
        @Override 
        public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { 
            System.out.println("operateTm:"+entity.getClass().getName()+"--OperateTm:"+new Date()+"--操作用户:当前登录用户"); 
            getOperateDetails(previousState, currentState, propertyNames); 
            return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types); 
        } 
     
     
        /**
         * 操作前后的数据差异
         *
         * @param oldState
         * @param state
         * @param operateLog
         * @return
         */ 
        private void getOperateDetails(Object[] oldState, Object[] state, String[] propertyNames) { 
            for (int i = 0; i < propertyNames.length; i++) { 
                if (!equalsObject(oldState[i], state[i])) { 
                    System.out.println("Field:"+propertyNames[i]+"NewValue:"+state[i] +"OldValue:"+oldState[i]); 
                } 
            } 
        } 
     
        private boolean equalsObject(Object o1, Object o2) { 
            if (o1 == null && o2 != null) { 
                return false; 
            } 
            if (o2 == null && o1 != null) { 
                return false; 
            } 
            if (o1 == null && o2 == null) { 
                return true; 
            } 
            return o1.equals(o2); 
        } 
    } 






Xml代码  收藏代码

    <!--hibernate配置--> 
     
        <bean id="myInterceptor" class="com.sf.sfbuy2.context.filter.DaoLogInterceptor"/> 
        <bean id="postUpdateListener" class="com.sf.sfbuy2.context.filter.PostUpdateListener"></bean> 
        <bean id="sessionFactory" 
              class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     
            <property name="dataSource"> 
                <ref bean="dataSource"/> 
            </property> 
            <property name="entityInterceptor"> 
                <ref bean="myInterceptor" /> 
            </property> 
            <property name="hibernateProperties"> 
                <props> 
                    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
                    <prop key="hibernate.show_sql">true</prop> 
                    <prop key="hibernate.format_sql">true</prop> 
                    <prop key="use_sql_comments">true</prop> 
                    <prop key="javax.persistence.validation.mode">none</prop> 
                    <prop key="hibernate.validator.apply_to_ddl">false</prop> 
                    <prop key="hibernate.validator.autoregister_listeners">false</prop> 
     
                </props> 
            </property> 
            <property name="packagesToScan"> 
                <list> 
                    <value>com.sf.sfbuy2.db.entity</value> 
                </list> 
            </property> 
        </bean> 

2、Hibernate的事件监听机制



Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会执行监听器中的事件处理方法

在某些功能的设计中,我们即可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现



Hibernate中事件与对应的监听器接口

                 事件类型                                                       监听器接口

                     auto-flush                                                    AutoFlushEventListener
                        merge                                                       MergeEventListener
                        delete                                                       DeleteEventListener
                        persist                                                      PersistEventListener
                    dirty-check                                                    DirtyCheckEventListener
                         evice                                                        EvictEventListener
                          flush                                                        FlushEventListener
                    flush-entity                                                    FlushEntityEventListener
                          load                                                         LoadEventListener
                 load-collection                                                  InitializeCollectEventListener
                          lock                                                          LockEventListener
                      refresh                                                         RefreshEventListener
                      replicate                                                      ReplicateEventListener
                     save-update                                                 SaveOrUpdateEventListener
                     pre-load                                                        PreLoadEventListener
                     pre-update                                                    PreUpdateEventListener
                     pre-delete                                                     PreDeleteEventListener
                     pre-insert                                                      PreInsertEventListener
                     post-load                                                       PostLoadEventListener
                     post-update                                                   PostUpdateEventListener
                     post-delete                                                    PostDeleteEventListener
                     post-insert                                                     PostInsertEventListener




应用Hibernate事件监听器

用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类

通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象

LogPostLoadEventListener


Java代码  收藏代码

    import org.hibernate.event.PostLoadEvent; 
    import org.hibernate.event.PostLoadEventListener; 
    public class LogPostLoadEventListener implements PostLoadEventListener { 
        private static final long serialVersionUID = 404241098418965422L; 
        public void onPostLoad(PostLoadEvent event) { 
            System.out.println("Class:" + event.getEntity().getClass().getName() + ",id:" 
                    + event.getId()); 
        } 
    } 

修改Hibernate.cfg.xml文件
Xml代码  收藏代码

    <mapping resource="com/rbh/examples/Guestbook.hbm.xml" /> 
            <listener type="post-load" class="com.rbh.examples.LogPostLoadEventListener" /> 
        </session-factory> 
    </hibernate-configuration> 

或者通过Configuration 对象注册这个监听器对象
Java代码  收藏代码

    Configuration config = new Configuration(); 
    config.setListener("post-load", new LogPostLoadEventListener()); 
    config.configure(); 
    Session session = config.buildSessionFactory().getCurrentSession(); 



编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.



使用监听器实现记录操作日志

利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值



监听器与拦截器的比较

监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
分享到:
评论

相关推荐

    Hibernate事件框架之拦截器使用源代码

    为了更好地控制持久化行为,Hibernate 提供了一个强大的事件处理机制,其中就包括了拦截器(Interceptor)。拦截器允许开发者在对象状态变化时执行自定义逻辑,比如更新时间戳、记录审计日志等。 #### 定义拦截器 ...

    拦截器和控制器的区别

    拦截器 interceptor 过滤器 filter web.xml implements filter filterchain arg2.doFilter(req,resp); 监听器 servlet application /session /request 6/8 个 1、拦截器 定义拦截器的包 定义拦截器的...

    Struts1 拦截器(SAIF)的使用

    Struts1 框架是Java Web开发中的一个经典MVC框架,它的核心组件之一就是拦截器(Interceptor)。拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理...

    Struts拦截器案例——登陆

    例如,可以创建一个名为`LoginInterceptor`的拦截器,然后在`&lt;package&gt;`标签内使用`&lt;interceptors&gt;`和`&lt;interceptor&gt;`来声明和配置它。 2. **拦截器实现**:创建一个实现`Interceptor`接口的类,重写`intercept()`...

    登录拦截器

    1. **定义拦截器**:在Struts2中,我们需要创建一个实现了`com.opensymphony.xwork2.interceptor.Interceptor`接口的类。这个类将包含拦截逻辑,例如检查session中是否存在登录信息。 2. **配置拦截器**:在`struts....

    登陆拦截器

    **拦截器(Interceptor)**是Struts2框架的核心特性之一,它允许开发者在Action执行前后插入自定义逻辑。拦截器可以用来实现日志记录、权限检查、事务处理等跨切面的功能。在登录场景中,拦截器通常用于验证用户的...

    拦截器登陆权限验证案例

    在Java Web开发中,拦截器(Interceptor)是一种重要的设计模式,尤其在框架如Spring MVC或Struts2中,用于在请求处理之前或之后执行特定逻辑。在这个“拦截器登陆权限验证案例”中,我们将深入探讨如何在Struts2...

    ssh权限管理和日志拦截器

    在SSH(Struts2、Spring、Hibernate)框架中,权限管理和日志拦截器是两个重要的概念,它们在大型企业级应用开发中起到了关键作用。SSH框架允许开发者通过拦截器(Interceptor)来增强或修改默认的请求处理流程。...

    过滤器与拦截器的区别

    在Java Web开发中,过滤器(Filter)和拦截器(Interceptor)是两种常见的处理请求和响应的机制,它们各自有着不同的特性和应用场景。下面将详细解释这两种技术的区别以及它们在SSH(Spring、Struts和Hibernate)...

    Struts2拦截器的简单登录应用.zip_jsp_lonelyi7a

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者插入自定义的逻辑来扩展或增强Action执行的流程。在这个“Struts2拦截器的简单登录应用”中,我们将深入理解如何利用拦截器实现用户登录验证。 ...

    struts拦截器实现等待页面

    在SSH(Struts2、Spring、Hibernate)系统中,拦截器用于增强应用程序的功能,比如权限检查、日志记录、事务管理等。在本场景中,我们关注的是如何利用Struts拦截器来实现一个等待页面,以提升用户体验。 当系统...

    SSH2及模型驱动,拦截器注入

    在SSH2框架中,拦截器(Interceptor)是非常重要的组件之一,它可以用来增强Action的功能,比如权限检查、日志记录等。为了更好地利用Spring的依赖注入功能,可以通过以下步骤在拦截器中注入Spring管理的对象: 1. ...

    Hibernate与struts2结合使用的demo

    Struts2的核心组件包括Action(业务逻辑处理)、Result(展示结果)、Interceptor(拦截器)和配置文件(struts.xml)。开发者可以通过定义Action类来实现业务逻辑,然后通过配置Action和Result来定义请求和响应的...

    hibernate实现动态表查询的多种解决方案

    2. **拦截器(Interceptor)**:Hibernate提供了一个非常强大的扩展点——拦截器,它可以用来拦截实体的各种生命周期事件。通过实现`org.hibernate.event.spi.Interceptor`接口,可以自定义拦截器逻辑,比如修改SQL...

    struts拦截器防止未登陆访问内部系统

    拦截器(Interceptor)是Struts2框架中的关键组件之一,用于在执行Action之前或之后进行一系列的预处理或后处理任务。例如,它可以用于身份验证、日志记录、数据校验等。拦截器的设计遵循AOP(面向切面编程)思想,...

    燕山大学 spring hibernate struts 三大框架 期末复习资料

    - **拦截器定义**: 拦截器可以是实现了 Interceptor 接口的类,也可以是继承了 AbstractInterceptor 或 MethodFilterInterceptor 抽象类的类。 - **自定义拦截器**: 可以通过实现 Interceptor 接口或继承 ...

    Struts2+Hibernate实现的登录功能

    在实际应用中,Struts2与Hibernate的集成通常通过拦截器(Interceptor)实现。例如,我们可以创建一个自定义的登录拦截器,该拦截器在Action执行之前检查用户的登录状态。如果用户未登录,拦截器会重定向到登录页面...

    struts+hibernate整合jar包

    Struts 2是Struts 1的升级版,它基于MVC设计模式,提供了强大的动作(Action)和结果(Result)管理,以及强大的拦截器(Interceptor)机制。Struts 2的核心组件包括: 1. **Action类**:处理用户请求的业务逻辑。 ...

    Struts拦截器实现拦截未登陆用户实例解析

    其中,intercept方法是拦截器的核心方法,它将被拦截器框架调用,以便在Action执行之前或之后进行拦截。 在本例中,我们将实现一个检查权限的拦截器,名为CheckPrivilegeInterceptor。这个拦截器继承自...

    spring hibernate实现动态替换表名(分表)的方法

    首先,我们需要新建一个 Hibernate 拦截器类,用于拦截所有数据库操作,并替换掉其中的表名。 ```java public class AutoTableNameInterceptor extends EmptyInterceptor { private String srcName = StringUtils....

Global site tag (gtag.js) - Google Analytics