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)