`
poethelasi
  • 浏览: 6075 次
文章分类
社区版块
存档分类
最新评论

Hibernate 专题研究系列(二) 解析Hibernate 拦截器Interceptor

阅读更多

 

目录
  •  Hibernate 拦截器作用
  •  Hibernate 拦截器API
  •  Hibernate 拦截器类型及作用域
  •  Hibernate 拦截器源码欣赏
1)Interceptor 作用
1.1)为用户(程序员)提供一个接口,使得用户可以改变Hibernate内部运行的一些行为,比如,如何获取实体的完全限定名称、如何判断实体的状态等。
1.2)为用户提供一个接口或者一个时机点,让用户可以改变实体的属性值,如保存前改变某些属性的值等。
 
Hibernate Interceptor 不能通过配置文件进行配置,只能通过编程配置。当然,如果使用了Spring框架,可以通过IOC容器进行注入。下面将会演示如何配置
自定义的Interceptor.
 
2)Hibernate 拦截器API
    Hibernate 预定义了一些内部行为可以让用户根据自身的实际需求进行处理,这些行为定义在org.hibernate.Interceptor 接口中,用户可以实现接口中定义的
具体方法,然后按照自己的方式进行处理。如果需要编写自己的拦截器,需要实现该接口。
    Hibernate默认的拦截器是org.hibernate.EmptyInterceptor。它不做任何处理。
 
//保存实体前调用
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;
 
//执行flush操作前调用
public void preFlush(Iterator entities) throws CallbackException;
 
//执行flush操作后调用
public void postFlush(Iterator entities) throws CallbackException;
 
//瞬时态判断逻辑
public Boolean isTransient(Object entity);
 
//获取指定实体的完全限定名
public String getEntityName(Object object) throws CallbackException;
 
 
3)Hibernate 拦截器类型及作用域
Hibernate 拦截器从作用域上分为两种类型:SessionFactory-scope和Session-scope 两种。
3.1)SessionFactory-scope
所有的Session使用同一个Interceptor实例。默认拦截器是EmptyInterceptor。
可以按照下面方法配置SessionFactory-scope类型的Interceptor:
 
Configuration configuration = new Configuration().configure();
configuration.setInterceptor( new MyInterceptor());
SessionFactory sessionFactory = configuration.buildSessionFactory();
 
3.2)Session-scope
每个Session实例拥有自己的Interceptor,互相之间不影响。默认情况下,Session会使用在SessionFacotry中配置的Interceptor,如果
需要为某个Session配置Interceptor,则需要安装下面方式进行:
 
SessionBuilder sessionBuilder = sessionFactory.
                   withOptions().interceptor( new MyInterceptor()); //使用了链式操作模式
Session session = sessionBuilder.openSession();
 
一般情况下,我们会按照下面方式打开Session:
 
Session session sessionFactory.openSession();
 
其实相当于:
 
SessionBuilder sessionBuilder = sessionFactory.withOptions()
Session session = sessionBuilder.openSession();
 
4) Hibernate 拦截器源码欣赏
下面我们看看Hibernate如何实现Interceptor的行为: 
 
AbstractSaveEventListener:
protected Serializable performSaveOrReplicate(
                Object entity,
                EntityKey key,
                EntityPersister persister,
                 boolean useIdentityColumn,
                Object anything,
                EventSource source,
                 boolean requiresImmediateIdAccess) {
    boolean substitute = substituteValuesIfNecessary( entity, id, values, persister, source );
}
 
protected boolean substituteValuesIfNecessary(
           Object entity,
           Serializable id,
           Object[] values,
           EntityPersister persister,
           SessionImplementor source) {
      boolean substitute = source.getInterceptor().onSave(
                entity,
                id,
                values,
                persister.getPropertyNames(),
                persister.getPropertyTypes()
     );
 
      //keep the existing version number in the case of replicate!
      if ( persister.isVersioned() ) {
           substitute = Versioning.seedVersion(
                     values,
                     persister.getVersionProperty(),
                     persister.getVersionType(),
                     source
           ) || substitute;
     }
      return substitute;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

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

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

    拦截器和控制器的区别

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

    hibernate源码分析

    **三、拦截器(Interceptor)与事件监听器(Listener)** Hibernate提供拦截器和事件监听器来扩展其行为。Interceptor是在特定操作(如保存、更新、删除等)执行前后被调用的接口,允许用户自定义行为。Listener则是...

    Struts1 拦截器(SAIF)的使用

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

    Struts拦截器案例——登陆

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

    登陆拦截器

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

    登录拦截器

    在Spring、Struts2和Hibernate这三大框架的组合应用中,登录拦截器的作用尤为显著,它能确保只有经过身份验证的用户才能访问受保护的页面或执行特定的业务操作。 首先,让我们来理解一下这三个框架的角色: 1. **...

    拦截器登陆权限验证案例

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

    struts+hibernate整合jar包

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

    Hibernate与struts2结合使用的demo

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

    hibernate二级缓存java包下载

    Hibernate 支持事件驱动的更新机制,如监听器(Listener)和拦截器(Interceptor),以便在数据变更后正确处理缓存。 7. **缓存过期与失效**: - 设置缓存项的生命周期或基于访问频率来决定何时清理缓存,防止内存...

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

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

    hibernate3.2_src官方源码

    7. **事件监听器和拦截器**:Hibernate允许在特定操作(如加载、保存、更新等)前后添加自定义逻辑,这在`org.hibernate.event`和`org.hibernate.interceptor`包中体现。 8. **实体生命周期**:源码中展示了...

    ssh权限管理和日志拦截器

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

    Struts2+Hibernate实现的登录功能

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

    Hibernate之struts2整合hibernate以及MVC分层架构的使用案例hibernate002

    它提供了动作(Action)和拦截器(Interceptor)等核心概念,实现了请求处理和业务逻辑的分离,提高了代码的可测试性和可维护性。Struts2与Spring、Hibernate等框架的整合能力也非常强大。 **3. MVC分层架构** MVC...

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

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

    struts2整合hibernate的网上银行模拟项目

    Struts2 使用拦截器(Interceptor)机制来扩展功能,如验证、日志、事务管理等。在本项目中,可能会包含多个Action类,每个类对应特定的银行服务,如账户查询、转账、存款等。 接下来,我们来看Hibernate。...

    struts_hibernate整合

    6. **添加拦截器**:Struts2允许我们自定义拦截器,例如事务管理拦截器,可以在Action调用前后处理数据库事务。 7. **结果转发**:在完成数据库操作后,使用Action的Result来转发到相应的JSP页面进行数据展示。 8....

Global site tag (gtag.js) - Google Analytics