HibernateORMHibernateORM最佳实践第8章Hibernate的拦截器和事件框架HibernateORM2回顾学会使用和管理Hibernate的二级缓存学会使用和管理Hibernate的查询缓存使用Hibernate的统计机制监视二级缓存的使用情况HibernateORM3目标了解和使用Hibernate拦截器了解和使用Hibernate事件框架HibernateORM4Interceptor在应用程序持久化操作之前或之后进行自定义操作(被拦截),其目的监控或者影响持久化对象操作.注意:①不同持久化方法对应不同的事件监听器②当某事件发生时,先调用拦截器进行反应,再调用该事件监听器,最后进行持久化对象操作.SessionInterceptorsave()load()delete()flush()其它持久化方法数据库实现Interceptor接口继承EmptyInterceptorHibernateORM5Interceptor接口③从上图中可以看出:针对Session接口中每一个对象持久化方法,Interceptor中都定义相应方法,可以编写自定义的拦截器.④可以为SessionFactory提供一个Interceptor实例,也可以为每一个Session创建一个Interceptor实例.⑤实现拦截器:直接实现接口Interceptor或继承EmptyInterceptor⑥启用拦截器使用编码方式,把自定义的拦截器绑定到一个session或sessionFactory对象上Sessionsession=getSessionFactory().openSession(new拦截器类);或Configurationcfg=newConfiguration().configure().setInterceptor(new拦截器类);SessionFactorysessionFactory=cfg.buildSessionFactory();HibernateORM6Interceptor接口方法voidonelete(Objectentity,Serializableid,Object[]state,String[]propertyNames,Type[]types)Interceptor接口要方法:1.与持久化对象事件相关方法:被操作类对象对象id对象属性値对象属性名对象属性类型HibernateORM7Interceptor接口方法booleanonLoad(Objectentity,Serializableid,Object[]state,String[]propertyNames,Type[]types)修改state,可以修改持久化类对象属性値返回true,在方法中修改对象属性值booleanonSave(Objectentity,Serializableid,Object[]state,String[]propertyNames,Type[]types)修改state,可以修改持久化类对象属性値返回true,在方法中修改对象属性值当对象在flush时被发现是脏数据,调用以下函数booleanonFlushDirty(Objectentity,Serializableid,Object[]currentState,Object[]preState,String[]propertyNames,Type[]types)当前属性值修改前的属性值返回true,在方法中修改currentState值HibernateORM8示例-1编写一个拦截器,可以监控持久化对象读与写操作,如果写入一个学生对象发现学生姓名为null,要用”学生”串来替换空名.HibernateORM9代码HibernateORM10示例-2学生与班级,设计拦截器监控删除持久对象的操作情况HibernateORM11代码HibernateORM12Interceptor接口方法2.与事务事件相关方法voidafterTransactionBegiin(Transactiontx)Transaction.begin()Transaction.commit()Transaction.rollback()voidafterTransactionCompletion(Transactiontx)voidbeforeTransactionCompletion(Transactiontx)HibernateORM13Interceptor接口方法3.与操作集合对象事件相关方法当某个对象的属性为集合时,保存该对象,其集合属性也同时保存,自动调用下面的方法集合被删除时调用voidonCollectionUpdate(Objectcollection,Serializablekey)集合被更新时调用HibernateORM14示例HibernateORM15代码HibernateORM16Interceptor接口方法4.其它与实体信息相关方法BooleanisTransient(Objectentity)判断是否持久化或游离态ObjectgetEntity(Stringentityname,Serializableid)获取实体对象StringgetEntityName(Objectobject)获取实体名Objectinstantiate(StringentityName,EntityModeentityMode,Serializableid)实例化实体类HibernateORM17Hibernate事件框架几乎每一个对象持久化方法,Hibernate都定义一个事件监听器接口,并且提供一个默认的实现类具体负责处理持久化事件.org.hibernate.event包中定义各种事件及监听器接口;org.hibernate.event.def包中定义监听器默认实现.实现自定义监听器实现监听器接口继承默认的监听器事件名+EventListeneron事件名(事件名Eventevent)监听器事件处理方法Default+事件名+EventListener默认的监听器类HibernateORM18注册监听器两种注册方式:①在hibernate.cfg.xml中配置hibernate-configurationsession-factory…eventtype=“事件名”listenerclass=“监听器类”/listenerclass=“监听器类”//event…eventtype=“事件名”listenerclass=“监听器类”/listenerclass=“监听器类”//event/session-factory/hibernate-configurationHibernateORM19注册监听器②通过编程方式注册监听器利用configuration类的方法setListener(事件名,监听器)或setListeners(事件名,监听器数组)注意:常用的事件名有loadpre-loadpost-loadsaveupdatepre-updatepost-updatedaletepre-deletepost-deletepre-insertpost-insertHibernateORM20示例编写一个监听器,可以监控持久化对象读与写操作,如果写入一个学生对象发现学生姓名为null,要用”学生”串来替换空名注册监听器HibernateORM21运行可以通过实现Hibernate的拦截器,或自定义事件监听器对Hibernate持久化对象的操作事件作出响应,进行监控、检查或修改来改变持久对象操作。HibernateORM22总结了解和使用Hibernate拦截器了解和使用Hibernate事件框架