`

Hibernate的拦截器和监听器(转)

    博客分类:
  • SSH
阅读更多


拦截器(Intercept):顾名思义,拦截操作,也就是在Hibernate做出动作之前会调用的方法。如果你有需要在Hibernate操作数据库之前想要做的操作,就需要用到这个东西了。 

监听器(Listener):监听,就是监视Hibernate的一举一动,如果我们要获取Hibernate各种操作PO的前前后后的信息,那就要用到他了。 

这里有的朋友可能就有疑问了,从上面的描述来看,这个监听器似乎能够实现拦截器的功能,因为他也能获取Hibernate操作数据库前的状况。 
其实不然,在此我只举出两个很典型的例子,大家就会明白他们俩是不能被互相取代的。 

1、监听器只会默默的获取信息,不会阻断Hibernate的工作,而用拦截器时,我们可以根据我们的需求,去终止某个Hibernate的持久化动作。 
2、如果我有这样一个需求,在PO保存时,我想按我的需求改变某个属性的值后,再保存入库。分析下知道,这个操作要在Hibernate执行 Save之前来做,那么看似拦截器和监听器都能实现,但实践一下就会知道,如果我们用监听器来做(比如此时用 PreInsertEventListener),当我们在此改变某属性值后,会发现,保存入库的仍然是原来的值,监听器的Pre******是不允许我们这样做的。此时就需要用到拦截器,实现其OnSave方法,在此进行处理。 

说完了这些,就简单说下他们的用法及配置方法。 

一、 
首先说监听器,我们以PostUpdateEventListener讲解 
新建一个我们自己的监听器类,实现PostUpdateEventListener接口即可

 

 

public class MyListener extends DefaultLoadEventListener    
implements PostUpdateEventListener {   
  
    public void onPostUpdate(PostUpdateEvent event) {   
        System.out.println(event.getEntity().getClass().getName()+":更新完毕");   
        for (int i = 0; i < event.getState().length; i++) {   
            // 更新前的值   
            Object oldValue = event.getOldState()[i];   
            // 更新后的新值   
            Object newValue = event.getState()[i];   
            //更新的属性名   
            String propertyName = event.getPersister().getPropertyNames()[i];   
        }   
    }   
}   
 

如果要实现其他监听器,只需实现其他的监听器接口即可,具体有哪些监听器,大家可以查看Hibernate包下的org.hibernate.event,里面能看到所有的监听器。 

之后要加载监听器,我这里只讲解用过spring注入sessionFactory,用property配置的方法,因为另外的两种配置方法在网上很容易搜索到,这里就不重复。 
先将我们的监听器定义到spring中

 

 

 

<bean id="myListener" class="com.app.common.util.hibernateSupport.MyListener">  
 

在sessionFactory的bean标签中加入如下内容:

 

 

<bean id="sessionFactory"  
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
...   
        <property name="eventListeners">    
            <map>  
                <entry key="post-update">  
                    <ref bean="myListener" />  
                </entry>  
            </map>  
        </property>  
...   
</bean>  
 

 

这样我们的监听器就可以工作了,当Hibernate执行update操作时,就会输出我们的信息了。 

二、 
再来说说拦截器 
拦截器的实现要比监听器简单得多。 
我们只要新建一个自己的拦截器类,继承自org.hibernate.EmptyInterceptor类,重写原来的方法,之后在spring中配置即可。 
简单例子:

 

 

public class MyIntercept extends EmptyInterceptor {   
       
    @Override  
    public boolean onSave(Object entity, Serializable id, Object[] state,   
            String[] propertyNames, Type[] types) {   
        //entity就是当前的实体对象   
        //如果当前操作的TbUser,则做处理   
        if(entity instanceof TbUser){   
            TbUser user=(TbUser)entity;   
            user.setUserPassword("123");   
            if(user.getUserId()==null){   
                //返回true则拦截本次操作   
                return true;   
            }   
        }   
        return super.onSave(entity, id, state, propertyNames, types);   
    }   
}   
 

 

配置文件:

 

 

<bean id="myIntercept"    
class="com.app.common.util.hibernateSupport.MyIntercept">  
.......   
<bean id="sessionFactory"    
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
...   
        <property name="entityInterceptor">    
            <ref bean="myIntercept"/>  
        </property>  
...   
</bean>  
 

以上内容基于Hibernate3,2.xx类似 

 

 

注:刚刚按照以上试验hibernate的监听器,为什么event.getOldState()一直为null,MSQL2008的原因?有知道的告知一下,谢谢....

 

service 方法中  f( T entity ){ //参数 entity 是已经被修改过属性的po对象

 

anotherEntity=dao.findById(entity.getId()); //重新查询出来一个 entity的对象

BeanUtils.copyProperties(entity,anotherEntity); // 把entity的改动,重新赋值一下

dao.update(anotherEntity); //更新 ,可以进入updateListener,getOldState 成功

}

 

 

service 方法中  f( T entity ){//参数 entity 是已经被修改过属性的po对象

 

 

dao.update(entity ); //更新 ,可以进入updateListener,getOldState ==null ????????

}

 

 

 

分享到:
评论

相关推荐

    拦截器和控制器的区别

    拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...

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

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

    前后台管理系统模板源代码 java语言 ssh开发框架 Spring+Struts+Hibernate

    又实现了权限拦截器、项目监听器、单元测试等功能。 页面简洁大气美观,系统耦合度小,可配置度高,几乎包含了全部常用功能,是很好的学习和使用框架,可直接部署测试。 项目访问路径:...

    从零开始学Spring Boot

    1.25 Spring Boot 拦截器HandlerInterceptor 1.26 Spring Boot启动加载数据CommandLineRunner 1.27 Spring Boot环境变量读取和属性对象的绑定 1.28 Spring Boot使用自定义的properties 1.29 改变自动扫描的包 1.30 ...

    传智播客黑马35期

    day21_监听器 day22_文件上传与下载 day23_基础加强 day24_在线支付&JavaMail; day25_编码实战day01 day26_编码实战day02 day27_编码实战day02 day28_struts2基础 day29_struts2加强 day30_struts2拦截器&...

    从J2SE到J2EE知识点介绍

    1. struts2的拦截器定义以及使用 153 2. struts标签 160 3. Struts 2 标签库说明及使用 160 4. set 描述 169 5. text 描述 170 6. property 描述 170 7. Struts的异常处理 171 8. Struts的上传与下载 178 五、 ...

    java后台框架源码

    listener:目前只有session的监听器,用于监听session的 service:具体的业务处理包 util:项目工具包 vo:存放业务结果数据的,响应页面的json对象就存放在里面ResultData类里面 conf文件:系统配置的文件 ...

    spring in action英文版

     11.1.1 安全拦截器  11.1.2 认证管理器  11.1.3 访问决策管理器  11.1.4 运行身份管理器  11.2 管理身份验证  11.2.1 配置ProviderManager  11.2.2 根据数据库验证身份  11.2.3 根据LDAP...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.8 实体的生命周期和监听器 444 10.8.1 实体的生命周期与回调事件 444 10.8.2 使用专门的监听器实现回调 448 10.8.3 为全部实体配置默认监听器 450 10.8.4 排除监听器 452 10.9 本章小结 455 第11章 JPA的查询支持...

    ssh对lob完美处理

    structs1.2 spring2.5 hibernate3.0 java web 对clob大文本 blob图像处理 这是一个完整的例子,整合了ckeidtor,servlet直接显示...配置了监听器,SPRING事物管理,structs1.2拦截器配置 如果有疑问联系QQ:766591490

    Spring in Action(第2版)中文版

    11.3.4使用注释声明拦截器 11.4小结 第12章访问企业服务 12.1从jndi中获取对象 12.1.1使用传统的jndi 12.1.2注入jndi对象 12.1.3在spring2中注入jndi对象 12.2发送电子邮件 12.2.1配置邮件发送器 12.2.2...

    Spring in Action(第二版 中文高清版).part2

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

    Spring in Action(第二版 中文高清版).part1

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

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

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

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

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

    Guns系统技术文档及视频

    │ │ │ ├─core----------------项目运行的核心依靠(例如aop日志记录,拦截器,监听器,guns模板引擎,shiro权限检查等) │ │ │ │ │ │ │ ├─modular----------------项目业务代码 │ │ │ │ │ │ │ ├─...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    Spring API

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

Global site tag (gtag.js) - Google Analytics