`
studentGuy1
  • 浏览: 16766 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的拦截与监听

阅读更多

拦截器(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()方法之后被调用
  • beforeTransactionComplet<wbr>ion()<br> 在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务</wbr>
  • afterTransactionCompleti<wbr>on()<br> 当完成一个事务之后,立刻调用此方法</wbr>

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

demo

log4j.properties

Log4j.properties代码复制代码收藏代码
  1. log4j.logger.com.rbh.examples=info,appender1
  2. log4j.appender.appender1=org.apache.log4j.FileAppender
  3. log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
  4. log4j.appender.appender1.File=ligfile.txt

LogEntityInterceptor

Java代码复制代码收藏代码
  1. packagecom.rbh.examples;
  2. importjava.io.Serializable;
  3. importorg.apache.log4j.Logger;
  4. importorg.hibernate.EmptyInterceptor;
  5. importorg.hibernate.type.Type;
  6. publicclassLogEntityInterceptorextendsEmptyInterceptor {
  7. privatestaticfinallongserialVersionUID = 1L;
  8. privateLogger logger = Logger.getLogger(LogEntityInterceptor.class);
  9. publicvoidonDelete(Object entity,Serializable id, Object[] state,String[] propertyNames,
  10. Type[] types){
  11. logger.info("删除数据");
  12. }
  13. publicbooleanonFlushDirty(Object entity,Serializable id, Object[] currentState,
  14. Object[] preState,String[] propertyNames,
  15. Type[] types){
  16. logger.info("修改数据");
  17. returnfalse;
  18. }
  19. publicbooleanonSave(Object entity,Serializable id, Object[] State,
  20. String[] propertyNames,
  21. Type[] types){
  22. logger.info("保存数据");
  23. returnfalse;
  24. }
  25. }

HibernateTest

Java代码复制代码收藏代码
  1. packagecom.rbh.examples;
  2. importjava.util.Date;
  3. importorg.hibernate.Session;
  4. importorg.hibernate.SessionFactory;
  5. importorg.hibernate.cfg.Configuration;
  6. publicclassHibernateTest {
  7. publicstaticvoidmain(String[] args)
  8. {
  9. HibernateTest test =newHibernateTest();
  10. test.testInterceptor();
  11. }
  12. publicvoidtestInterceptor()
  13. {
  14. LogEntityInterceptor interceptor=newLogEntityInterceptor();
  15. Configuration config=newConfiguration();
  16. config.setInterceptor(interceptor);
  17. config.configure();
  18. SessionFactory sf=config.buildSessionFactory();
  19. Session session=sf.getCurrentSession();
  20. Guestbook gb=newGuestbook();
  21. gb.setName("Narcissus");
  22. gb.setEmail("javac.q@gmail.com");
  23. gb.setCreatedTime(newDate());
  24. gb.setPhone("11102121");
  25. gb.setTitle("test Interceptor");
  26. gb.setContent("test Interceptor,test Interceptor");
  27. session.beginTransaction();
  28. session.save(gb);
  29. session.getTransaction().commit();
  30. session=sf.getCurrentSession();
  31. gb.setName("tom");
  32. session.beginTransaction();
  33. session.update(gb);
  34. session.getTransaction().commit();
  35. session=sf.getCurrentSession();
  36. session.beginTransaction();
  37. session.delete(gb);
  38. session.getTransaction().commit();
  39. }
  40. }

可以通过session方式加载拦截器对象,也可以通过Configuration对象加载拦截器

Configuration:对所有的session都会被拦截
session:只对当前的session进行拦截

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<wbr><br> load LoadEventListener<br> load-collection InitializeCollectEventLi<wbr>stener<br> lock LockEventListener<br> refresh RefreshEventListener<br> replicate ReplicateEventListener<br> save-update SaveOrUpdateEventListene<wbr>r<br> pre-load PreLoadEventListener<br> pre-update PreUpdateEventListener<br> pre-delete PreDeleteEventListener<br> pre-insert PreInsertEventListener<br> post-load PostLoadEventListener<br> post-update PostUpdateEventListener<br> post-delete PostDeleteEventListener<br> post-insert PostInsertEventListener</wbr></wbr></wbr>


应用Hibernate事件监听器

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

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

LogPostLoadEventListener<wbr></wbr>

Java代码复制代码收藏代码
  1. importorg.hibernate.event.PostLoadEvent;
  2. importorg.hibernate.event.PostLoadEventListener;
  3. publicclassLogPostLoadEventListener<wbr></wbr>implementsPostLoadEventListener {
  4. privatestaticfinallongserialVersionUID = 404241098418965422L;
  5. publicvoidonPostLoad(PostLoadEvent event) {
  6. System.out.println("Class:"+ event.getEntity().getClass().getName() +",id:"
  7. + event.getId());
  8. }
  9. }

修改Hibernate.cfg.xml文件

Xml代码复制代码收藏代码
  1. <mappingresource="com/rbh/examples/Guestbook.hbm.xml"/>
  2. <listenertype="post-load"class="com.rbh.examples.LogPostLoadEventListener<wbr>"</wbr>/>
  3. </session-factory>
  4. </hibernate-configuration>

或者通过Configuration 对象注册这个监听器对象

Java代码复制代码收藏代码
  1. Configuration config =newConfiguration();
  2. config.setListener("post-load",newLogPostLoadEventListener<wbr>());</wbr>
  3. config.configure();
  4. Session session = config.buildSessionFactory().getCurrentSession();

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

使用监听器实现审计日志

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

监听器与拦截器的比较

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

分享到:
评论

相关推荐

    hibernate3.zip 包含hibernate3.jar

    11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...

    hibernate框架基本包

    - **Hibernate拦截器**: 类似于监听器,但更灵活,可以直接修改对象的状态。 总结来说,“hibernate框架基本包”包含的资源旨在帮助开发者理解Hibernate的核心概念、操作和配置,以及如何在实际项目中有效利用它。...

    有关hibernate的论文

    此外,Hibernate支持事件监听器和拦截器,允许我们在特定操作前后插入自定义逻辑,如在对象保存前进行验证,或在对象删除后执行清理工作。 总的来说,这篇关于Hibernate的论文可能会深入剖析这些概念,并结合实例...

    Hibernate实战

    Hibernate是一个开源的ORM框架,它为Java开发者提供了一种高效、便捷的方式来管理数据库操作,消除了Java对象与SQL之间的鸿沟。在本书中,作者详细介绍了Hibernate的核心概念、配置、实体管理、数据持久化、查询语言...

    hibernate 开发工具包

    8. **事件监听和拦截器**:Hibernate允许注册监听器来监听特定的生命周期事件,如持久化、更新等,可以实现自定义逻辑。拦截器则是在这些事件触发前后进行额外操作的机制。 9. **类型转换和定制化**:Hibernate支持...

    Hibernate 中文api 等学习资料

    9. **拦截器和事件监听器**:学习如何自定义行为,比如在对象保存或删除前进行额外操作。 10. **JPA集成**:如果需要,可以了解Hibernate作为Java Persistence API(JPA)提供商的角色。 通过阅读和学习这些资料,...

    hibernate 2 升级参考文档

    在进行以上步骤的同时,还需要注意检查任何自定义的Hibernate拦截器、事件监听器或者其他扩展是否兼容Hibernate 3。另外,确保所有使用的API和方法在新版本中仍然可用,因为某些API在不同版本之间可能会被废弃或修改...

    hibernate框架配置源码

    Hibernate提供了一套事件监听系统,可以通过实现特定接口或使用拦截器来监听和干预对象的生命周期事件,如保存、更新、删除等。 通过学习和分析`hibernateDay3`中的源码,你可以更深入地理解这些概念,并且能够...

    hibernate3.5完整jar

    7. **事件监听器**:Hibernate 3.5支持事件监听机制,允许开发者注册监听器来拦截特定的持久化操作,如保存、更新、删除等,从而实现自定义的业务逻辑。 8. **级联操作**:在关联映射中,可以设置级联操作,比如在...

    Middlegen-Hibernate-r5,hibernate-extensions-2.1.3

    这些扩展可能包括对CGLIB或JPA的支持,也可能包含了一些自定义的拦截器、事件监听器或者更高级的查询构建工具。Hibernate Extensions使开发者能够更好地定制和扩展他们的Hibernate应用,以满足项目特定的需求。 在...

    hibernate动态分表

    3. 操作拦截:可以使用Hibernate的事件监听机制,比如Interceptor,来在数据保存或查询前、后执行分表逻辑。 4. 分页查询:在动态分表环境中,传统的数据库分页可能不再适用,因为数据分布在多个表中。此时,需要...

    Hibernate\hibernate3.2官方中文参考手册PDF

    8. **事件监听器和拦截器**:Hibernate允许用户自定义事件监听器或拦截器,以便在特定的生命周期事件(如对象的保存、更新、删除等)发生时执行自定义逻辑。 9. **实体生命周期**:Hibernate定义了几个关键的实体...

    Hibernate 中文参考文档

    事件监听与拦截器 Hibernate允许开发者注册事件监听器或拦截器,以在特定操作前后执行自定义逻辑,如对象的保存、更新和删除。 ### 10. 批量操作与性能优化 为了提高性能,Hibernate提供了批量插入、更新和删除...

    hibernate-core 核心jar包

    10. **事件和监听器**:Hibernate允许注册事件监听器,对特定的持久化操作(如加载、保存、更新、删除)进行拦截,实现定制化的逻辑,如日志记录、数据校验等。 `hibernate-core` jar包是使用Hibernate的基础,它...

    精通Hibernate(孙卫琴)

    最后,可能还会涉及Hibernate的事件监听机制和拦截器,提供自定义扩展的可能性。 总的来说,《精通Hibernate(孙卫琴)》旨在帮助读者全面理解Hibernate框架,熟练掌握其核心功能,并能够灵活应用于实际项目开发中。...

    hibernate-framework-orm-4.2.4.Final.zip

    Hibernate作为ORM工具,主要解决了Java应用与数据库之间的数据交互问题,通过将数据库表映射为Java类,实现对象与数据的自动转换。这使得开发者可以使用面向对象的方式来操作数据库,降低了数据库操作的复杂性。 2...

    hibernate

    13. **事件监听器**:Hibernate提供了事件监听机制,开发者可以实现特定的监听器接口,对对象的生命周期事件(如加载、保存、更新、删除等)进行拦截和自定义处理。 14. **JPA(Java Persistence API)兼容性**:...

    hibernate api 3.6.0 javadoc

    Hibernate的事件监听器和拦截器允许我们在特定的生命周期事件中插入自定义代码,如对象的加载、保存、更新和删除。这为开发者提供了扩展Hibernate行为的途径,Javadoc对此进行了详细的介绍。 七、其他高级特性 ...

    hibernate框架基础教程适合新手

    Hibernate提供了事件监听机制和拦截器,可以定制对象的生命周期行为,如在对象持久化前后执行特定操作。 12. **性能优化** 了解如何优化Hibernate性能是进阶的关键,包括合理使用批处理、避免N+1查询、减少数据库...

    最经典的hibernate教程_从入门到精通(全四篇)

    2. 扩展性与插件:了解Hibernate的事件监听器、拦截器,以及如何利用Hibernate Tools生成代码和逆向工程。 3. JPA与Hibernate的结合:对比JPA(Java Persistence API)和Hibernate,理解两者的关系和各自优缺点。 4....

Global site tag (gtag.js) - Google Analytics