拦截器(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()方法之后被调用
- beforeTransactionCompletion()
在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务
- afterTransactionCompletion()
当完成一个事务之后,立刻调用此方法
使用拦截器实现审计日志
审计日志指的是,在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间
demo
log4j.properties
-
log4j.logger.com.rbh.examples=info,appender1
-
log4j.appender.appender1=org.apache.log4j.FileAppender
-
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
-
log4j.appender.appender1.File=ligfile.txt
LogEntityInterceptor
-
packagecom.rbh.examples;
-
importjava.io.Serializable;
-
importorg.apache.log4j.Logger;
-
importorg.hibernate.EmptyInterceptor;
-
importorg.hibernate.type.Type;
-
-
publicclassLogEntityInterceptorextendsEmptyInterceptor{
-
-
privatestaticfinallongserialVersionUID=1L;
-
-
privateLoggerlogger=Logger.getLogger(LogEntityInterceptor.class);
-
-
publicvoidonDelete(Objectentity,Serializableid,Object[]state,String[]propertyNames,
-
Type[]types){
-
logger.info("删除数据");
-
}
-
-
publicbooleanonFlushDirty(Objectentity,Serializableid,Object[]currentState,
-
Object[]preState,String[]propertyNames,
-
Type[]types){
-
logger.info("修改数据");
-
returnfalse;
-
}
-
-
publicbooleanonSave(Objectentity,Serializableid,Object[]State,
-
String[]propertyNames,
-
Type[]types){
-
logger.info("保存数据");
-
returnfalse;
-
}
-
}
HibernateTest
-
packagecom.rbh.examples;
-
-
importjava.util.Date;
-
importorg.hibernate.Session;
-
importorg.hibernate.SessionFactory;
-
importorg.hibernate.cfg.Configuration;
-
-
publicclassHibernateTest{
-
publicstaticvoidmain(String[]args)
-
{
-
HibernateTesttest=newHibernateTest();
-
test.testInterceptor();
-
}
-
-
publicvoidtestInterceptor()
-
{
-
LogEntityInterceptorinterceptor=newLogEntityInterceptor();
-
Configurationconfig=newConfiguration();
-
config.setInterceptor(interceptor);
-
config.configure();
-
-
SessionFactorysf=config.buildSessionFactory();
-
Sessionsession=sf.getCurrentSession();
-
-
Guestbookgb=newGuestbook();
-
gb.setName("Narcissus");
-
gb.setEmail("javac.q@gmail.com");
-
gb.setCreatedTime(newDate());
-
gb.setPhone("11102121");
-
gb.setTitle("testInterceptor");
-
gb.setContent("testInterceptor,testInterceptor");
-
-
-
session.beginTransaction();
-
session.save(gb);
-
session.getTransaction().commit();
-
-
session=sf.getCurrentSession();
-
gb.setName("tom");
-
session.beginTransaction();
-
session.update(gb);
-
session.getTransaction().commit();
-
-
session=sf.getCurrentSession();
-
session.beginTransaction();
-
session.delete(gb);
-
session.getTransaction().commit();
-
}
-
-
}
可以通过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
loadLoadEventListener
load-collectionInitializeCollectEventListener
lock LockEventListener
refresh RefreshEventListener
replicateReplicateEventListener
save-update SaveOrUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-deletePreDeleteEventListener
pre-insertPreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-deletePostDeleteEventListener
post-insertPostInsertEventListener
应用Hibernate事件监听器
用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类
通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象
LogPostLoadEventListener
-
importorg.hibernate.event.PostLoadEvent;
-
importorg.hibernate.event.PostLoadEventListener;
-
publicclassLogPostLoadEventListenerimplementsPostLoadEventListener{
-
privatestaticfinallongserialVersionUID=404241098418965422L;
-
publicvoidonPostLoad(PostLoadEventevent){
-
System.out.println("Class:"+event.getEntity().getClass().getName()+",id:"
-
+event.getId());
-
}
-
}
修改Hibernate.cfg.xml文件
-
<mappingresource="com/rbh/examples/Guestbook.hbm.xml"/>
-
<listenertype="post-load"class="com.rbh.examples.LogPostLoadEventListener"/>
-
</session-factory>
-
</hibernate-configuration>
或者通过Configuration 对象注册这个监听器对象
-
Configurationconfig=newConfiguration();
-
config.setListener("post-load",newLogPostLoadEventListener());
-
config.configure();
-
Sessionsession=config.buildSessionFactory().getCurrentSession();
编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.
使用监听器实现审计日志
利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值
监听器与拦截器的比较
监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
使用监听器实现审计日志的一个demo 见附件
简要说明:AuditLog表式记录 日志的表
AuditLog.java和AuditLog.hbm.xml表的持久化映射
AuditLogEventListener 具体的实现类
分享到:
相关推荐
关于Hibernate的更多高级特性,例如二级缓存、拦截器和事件监听机制等,可以在学习Hibernate的官方文档或相关书籍中深入了解。通过上述步骤的详细讲解,希望读者能够掌握Hibernate数据源的配置方法,并成功应用于...
在Java的持久化框架Hibernate中,事件监听机制是其核心特性之一,它允许开发者在特定的数据操作前后执行自定义逻辑。这里的"hibernate事件 刷新事件.zip"资源可能包含了关于如何理解和应用Hibernate中的刷新事件...
Hibernate提供了一套事件监听系统,可以通过实现特定接口或使用拦截器来监听和干预对象的生命周期事件,如保存、更新、删除等。 通过学习和分析`hibernateDay3`中的源码,你可以更深入地理解这些概念,并且能够...
**三、拦截器(Interceptor)与事件监听器(Listener)** Hibernate提供拦截器和事件监听器来扩展其行为。Interceptor是在特定操作(如保存、更新、删除等)执行前后被调用的接口,允许用户自定义行为。Listener则是...
高级特性部分可能包含懒加载、缓存机制、二级缓存、性能优化、事件监听器、拦截器等。懒加载是Hibernate优化性能的一种策略,它延迟加载关联的对象,直到真正需要时才执行数据库查询。缓存机制可以提高数据访问速度...
8. **事件监听器和拦截器**:Hibernate允许用户自定义事件监听器或拦截器,以便在特定的生命周期事件(如对象的保存、更新、删除等)发生时执行自定义逻辑。 9. **实体生命周期**:Hibernate定义了几个关键的实体...
事件监听与拦截器 Hibernate允许开发者注册事件监听器或拦截器,以在特定操作前后执行自定义逻辑,如对象的保存、更新和删除。 ### 10. 批量操作与性能优化 为了提高性能,Hibernate提供了批量插入、更新和删除...
11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...
8. **Chapter 12:事件监听与拦截器** - Hibernate允许开发者定义事件监听器和拦截器,以在特定的生命周期阶段执行自定义逻辑。本章将探讨如何实现这些机制,提升业务逻辑的可扩展性。 通过以上章节的学习,读者将...
8. **事件监听器**:Hibernate 4.1.2引入了事件监听机制,可以通过自定义监听器来拦截对象的生命周期事件,如保存前、更新后等,增强了扩展性和灵活性。 9. **元数据API**:新的元数据API提供了一种更强大、更灵活...
文章涵盖了Hibernate的核心接口与类、标识符生成策略、对象生命周期管理、OSIV(Open Session In View)模式、泛型DAO模式、集合...数据拦截与事件监听、缓存机制、性能优化、Hibernate Annotations、Hibernate Search...
同时,Hibernate也提供了事件监听器和拦截器机制,允许自定义行为,实现更精细的控制。 最后,书中会探讨如何在实际项目中集成和优化Hibernate,包括事务管理、性能调优、问题排查等实战技巧。这有助于开发者在实际...
拦截器和事件(Interceptors and events)描述了如何使用Hibernate的拦截器和事件监听器来处理实体生命周期内的各种事件。 HQL和JPQL(Hibernate Query Language and Java Persistence Query Language)是Hibernate...
7. **事件监听器与拦截器** Hibernate允许开发者注册事件监听器,如`PreLoadEventListener`、`PostInsertEventListener`等,以在特定操作前后执行自定义逻辑。拦截器(Interceptor)则提供了更灵活的扩展点,可以在...
9. **事件监听和拦截器**:Hibernate允许用户自定义事件监听器和拦截器,对特定操作如保存、更新、删除等进行扩展和定制。 10. **性能优化**:通过批处理、缓存策略、连接池管理等方式,可以优化Hibernate的性能。...
9. **事件监听器和拦截器**: Hibernate允许开发者定义事件监听器和拦截器,对实体的生命周期事件进行监听和处理,如保存、更新、删除等操作前后的回调。 10. **性能优化**: Hibernate提供了多种性能优化策略,如...
10. **事件和监听器**:Hibernate允许注册事件监听器,对特定的持久化操作(如加载、保存、更新、删除)进行拦截,实现定制化的逻辑,如日志记录、数据校验等。 `hibernate-core` jar包是使用Hibernate的基础,它...
13. **事件监听器**:Hibernate提供了事件监听机制,开发者可以实现特定的监听器接口,对对象的生命周期事件(如加载、保存、更新、删除等)进行拦截和自定义处理。 14. **JPA(Java Persistence API)兼容性**:...
9. **事件监听器(Event Listeners)**:Hibernate允许我们定义事件监听器,对实体的生命周期事件(如加载、保存、更新、删除等)进行拦截处理。 10. **方言(Dialect)**:Hibernate支持多种数据库,通过方言来...
3. 操作拦截:可以使用Hibernate的事件监听机制,比如Interceptor,来在数据保存或查询前、后执行分表逻辑。 4. 分页查询:在动态分表环境中,传统的数据库分页可能不再适用,因为数据分布在多个表中。此时,需要...