- 浏览: 248624 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
javatozhang:
讲解的的确不错。很实用。
Hibernate数据拦截与事件监听 -
sjx19871109:
更正一个地方:<event type="pos ...
Hibernate search -
xifan:
你好,楼主。
mutable="false 好像是 ...
Hibernate持久化对象生命周期 -
leo_cao:
很好,很实用
Hibernate数据拦截与事件监听 -
fehly:
47816778 写道你这样不会出现number 的精度问题吗 ...
Hibernate Annotations
拦截器(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
package com.rbh.examples; import java.io.Serializable; import org.apache.log4j.Logger; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; public class LogEntityInterceptor extends EmptyInterceptor { private static final long serialVersionUID = 1L; private Logger logger = Logger.getLogger(LogEntityInterceptor.class); public void onDelete(Object entity,Serializable id, Object[] state,String[] propertyNames, Type[] types){ logger.info("删除数据"); } public boolean onFlushDirty(Object entity,Serializable id, Object[] currentState, Object[] preState,String[] propertyNames, Type[] types){ logger.info("修改数据"); return false; } public boolean onSave(Object entity,Serializable id, Object[] State, String[] propertyNames, Type[] types){ logger.info("保存数据"); return false; } }
HibernateTest
package com.rbh.examples; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateTest { public static void main(String[] args) { HibernateTest test =new HibernateTest(); test.testInterceptor(); } public void testInterceptor() { LogEntityInterceptor interceptor=new LogEntityInterceptor(); Configuration config=new Configuration(); config.setInterceptor(interceptor); config.configure(); SessionFactory sf=config.buildSessionFactory(); Session session=sf.getCurrentSession(); Guestbook gb= new Guestbook(); gb.setName("Narcissus"); gb.setEmail("javac.q@gmail.com"); gb.setCreatedTime(new Date()); gb.setPhone("11102121"); gb.setTitle("test Interceptor"); gb.setContent("test Interceptor,test Interceptor"); 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
load LoadEventListener
load-collection InitializeCollectEventListener
lock LockEventListener
refresh RefreshEventListener
replicate ReplicateEventListener
save-update SaveOrUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-delete PreDeleteEventListener
pre-insert PreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-delete PostDeleteEventListener
post-insert PostInsertEventListener
应用Hibernate事件监听器
用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类
通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象
LogPostLoadEventListener
import org.hibernate.event.PostLoadEvent; import org.hibernate.event.PostLoadEventListener; public class LogPostLoadEventListener implements PostLoadEventListener { private static final long serialVersionUID = 404241098418965422L; public void onPostLoad(PostLoadEvent event) { System.out.println("Class:" + event.getEntity().getClass().getName() + ",id:" + event.getId()); } }
修改Hibernate.cfg.xml文件
<mapping resource="com/rbh/examples/Guestbook.hbm.xml" /> <listener type="post-load" class="com.rbh.examples.LogPostLoadEventListener" /> </session-factory> </hibernate-configuration>
或者通过Configuration 对象注册这个监听器对象
Configuration config = new Configuration(); config.setListener("post-load", new LogPostLoadEventListener()); config.configure(); Session session = config.buildSessionFactory().getCurrentSession();
编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.
使用监听器实现审计日志
利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值
监听器与拦截器的比较
监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
使用监听器实现审计日志的一个demo 见附件
简要说明:AuditLog表式记录 日志的表
AuditLog.java 和AuditLog.hbm.xml表的持久化映射
AuditLogEventListener 具体的实现类
- Hibernate_.rar (1.4 MB)
- 下载次数: 224
发表评论
-
Hibernate与Struts2,Spring
2010-04-25 19:23 1545Struts2 框架 Struts是Apache ... -
Hibernate search
2010-04-22 15:28 6207搜索引擎 全文搜索引 ... -
Hibernate Annotations
2010-04-21 14:54 7011在过去几年里,Hibernate不断发展,几乎成为Jav ... -
Hibernate性能优化
2010-04-20 16:25 1392使用dynamic-insert与dynamic-update ... -
Hibernate的缓存
2010-04-19 19:47 2028持久层缓存的级别 事务级别的缓存 应用(进程)级别的缓存 ... -
Hibernate过滤器
2010-04-16 17:31 1490Hibernate过滤器的概念 Hibernate过滤器类 ... -
Hibernate继承映射
2010-04-15 19:48 1016继承映射 3种方式,继承关系映射到数据库的表中 1.继承关 ... -
Hibernate的事务管理
2010-04-14 20:00 1318数据库事务数据库的事务指的是把一系列的数据库操作组成一个单元, ... -
Native SQL查询
2010-04-13 23:15 1220HQL写的有点累有些东西 ... -
HQL查询
2010-04-13 20:46 1529Query接口Query类型与org.hibernate.Cr ... -
Criteria查询
2010-04-12 18:42 12386Hibernate的三种查询方式 1.HQL (Hibern ... -
映射多对多关联关系
2010-04-10 15:19 1371多对多单向关联 使用多对多关联,需要借助一个起中介作用的连接 ... -
映射一对一关联关系
2010-04-09 21:08 978共享主键关系 两个关联表使用相同的主键值 类: ... -
Hibernate映射多对一关联关系
2010-04-08 15:03 1451多对一的单向关联 表于表的关联可以分为一对一,一对多,多对一 ... -
Hibernate组件映射
2010-04-07 16:03 5233组件Components 除了粗粒度的对象模型设计(一个表 ... -
Hibernate的集合映射
2010-04-06 15:31 1239Set 接口 set类型的对象,被加入的对象不能重复, ... -
浅谈OSIV与泛型DAO模式
2010-04-05 22:13 3597open session in view 简称 O ... -
java.lang.NoClassDefFoundError: org/hibernate/Session的异常
2010-03-22 15:15 7111今天写程序突然报这个错误,挺郁闷的,因为这个包是导入别人的(事 ... -
Hibernate持久化对象生命周期
2010-03-19 14:41 2336持久化对象生命周期 Persisten ... -
Hibernate标示符属性的生成策略
2010-03-18 16:53 1502标示符属性 Hibernate中的标示符属性,也可以称为Hi ...
相关推荐
关于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)兼容性**:...
7. **事件监听器**:Hibernate 3.5支持事件监听机制,允许开发者注册监听器来拦截特定的持久化操作,如保存、更新、删除等,从而实现自定义的业务逻辑。 8. **级联操作**:在关联映射中,可以设置级联操作,比如在...
9. **事件监听器(Event Listeners)**:Hibernate允许我们定义事件监听器,对实体的生命周期事件(如加载、保存、更新、删除等)进行拦截处理。 10. **方言(Dialect)**:Hibernate支持多种数据库,通过方言来...