`
lovnet
  • 浏览: 6710559 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

hibernate 拦截hibernate事件

 
阅读更多
拦截hibernate事件:
例子实现审计日志:
1、创建标记接口
用这个接口给所有应该子被自动审计的持久化类做上标记:
  1. /**
  2. * 例子实现审计日志:
  3. * 1、创建标记接口
  4. * 用这个接口给所有应该子被自动审计的持久化类做上标记
  5. * @author partner4java
  6. *
  7. */
  8. publicinterfaceAuditable {
  9. publicLong getId();
  10. }

2、创建和映射日志记录
创建新的持久化类AuditLogRecord。这个类标识你想要的审计数据库表中记入日志信息:
  1. /**
  2. * 2、创建和映射日志记录
  3. * 创建新的持久化类AuditLogRecord。这个类标识你想要的审计数据库表中记入日志信息
  4. * @author partner4java
  5. *
  6. */
  7. publicclassAuditLogRecordimplementsSerializable {
  8. privateLong auditLogId;
  9. privateString message;
  10. privateLong entityId;
  11. privateClass entityClass;
  12. privateLong userId;
  13. privateDate created;
  1. <classname="AuditLogRecord"table="Audit_Log_Record"mutable="false">
  2. <id name="auditLogId"column="audit_Log_Id"type="long">
  3. <generatorclass="native"/>
  4. </id>
  5. <property name="message"length="200"></property>
  6. <property name="entityId"column="entity_Id"type="long"not-null="true"></property>
  7. <property name="entityClass"column="entity_Class"type="class"not-null="true"></property>
  8. <property name="userId"column="user_Id"type="long"></property>
  9. <property name="created"type="java.util.Date"not-null="true"update="false"></property>
  10. </class>


3、编写拦截器
当调用save时(),应该自动调用logEvent()方法。利用hibernate完成实现Interceptor接口。
  1. /**
  2. * 3、编写拦截器
  3. * 当调用save时(),应该自动调用logEvent()方法。利用hibernate完成实现Interceptor接口。
  4. * @author partner4java
  5. *
  6. */
  7. publicclassAuditLogInterceptorextendsEmptyInterceptor {
  8. privateSession session;
  9. privateLong userId;
  10. privateSet inserts =newHashSet();
  11. privateSet updates =newHashSet();
  12. publicvoidsetSession(Session session) {
  13. this.session = session;
  14. }
  15. publicvoidsetUserId(Long userId) {
  16. this.userId = userId;
  17. }
  18. /**
  19. * 每当hibernate侦测到脏对象时,就调用
  20. * Called when an object is detected to be dirty, during a flush. The interceptor may modify the detected currentState, which will be propagated to both the database and the persistent object. Note that not all flushes end in actual synchronization with the database, in which case the new currentState will be propagated to the object, but not necessarily (immediately) to the database. It is strongly recommended that the interceptor not modify the previousState.
  21. */
  22. publicbooleanonFlushDirty(Object entity, Serializable id,
  23. Object[] currentState, Object[] previousState,
  24. String[] propertyNames, Type[] types) {
  25. if(entityinstanceofAuditable){
  26. inserts.add(entity);
  27. }
  28. returnfalse;
  29. }
  30. /**
  31. * 保存实体时
  32. * Called before an object is saved. The interceptor may modify the state, which will be used for the SQL INSERT and propagated to the persistent object.
  33. */
  34. publicbooleanonSave(Object entity, Serializable id, Object[] state,
  35. String[] propertyNames, Type[] types) {
  36. if(entityinstanceofAuditable){
  37. updates.add(entity);
  38. }
  39. returnfalse;
  40. }
  41. /**
  42. * hibernate在执行了把持久化上下文实现为与数据库同步的SQL之后调用他
  43. * Called after a flush that actually ends in execution of the SQL statements required to synchronize in-memory state with the database
  44. */
  45. publicvoidpostFlush(Iterator entities)throwsCallbackException{
  46. try{
  47. for(Iterator it = inserts.iterator();it.hasNext();){
  48. Auditable auditable = (Auditable) it.next();
  49. AuditLog.logEvent("create",auditable,userId,session.connection());
  50. }
  51. for(Iterator it = updates.iterator();it.hasNext();){
  52. Auditable auditable = (Auditable) it.next();
  53. AuditLog.logEvent("update",auditable,userId,session.connection());
  54. }
  55. }finally{
  56. inserts.clear();
  57. updates.clear();
  58. }
  59. }
  60. }


4、启用拦截器
第一次打开会话时,你需要把Interceptor分配到Hibernate Session:
  1. publicclassItemDao {
  2. publicvoidsaveDao(Item item){
  3. AuditLogInterceptor interceptor =newAuditLogInterceptor();
  4. Session session = getSessionFactory().openSession(interceptor);
  5. Transaction tx = session.beginTransaction();
  6. interceptor.setSession(session);
  7. interceptor.setUserId(1L);
  8. session.save(item);
  9. tx.commit();
  10. session.close();
  11. }
  12. }

AuditLog:
  1. publicclassAuditLog {
  2. publicstaticvoidlogEvent(String message, Auditable auditable,
  3. Long userId, Connection connection) {
  4. Session session = getSessionFactory().openSession(connection);
  5. try{
  6. AuditLogRecord auditLogRecord =newAuditLogRecord(message, auditable.getId(),
  7. auditable.getClass(), userId,newDate());
  8. session.save(auditLogRecord);
  9. session.flush();
  10. }finally{
  11. session.close();
  12. }
  13. }
  14. }


调用:
  1. ItemDao itemDao =newItemDao();
  2. itemDao.saveDao(newItem("hello2"));
  3. //hibernate打印:
  4. //Hibernate: insert into ITEM (ITEM_NAME) values (?)
  5. //Hibernate: insert into Audit_Log_Record (message, entity_Id, entity_Class, user_Id, created) values (?, ?, ?, ?, ?)







内核事件系统:
Hibernate3.x与Hibernate2.x相比,是内核持久化引擎实现的一项重要的重新设计。新内核引擎基于一个事件/监听器的模型。
(默认方法通过DefaultLoadEventListener处理)
监听器实际上应该被认为是单例,意味着他们在请求之间被共享,因而不应该把任何事务相关的状态保存为实例变量。


cfg.getEventListeners().setLoadEventListeners(listenerStack);

hibernate:

...
<event type="load">
<listener class="mylis.."/>
</event>
</session-factory>

JPA:
...
<property name="hiernate.ejb.event.load" value="mylis...,..."/>
</properties>
</persistence-unit>
分享到:
评论

相关推荐

    Hibernate事件框架之拦截器使用源代码

    使用拦截器时按如下步骤进行: (1)定义实现Interceptor接口的拦截器类 (2)通过Session启用拦截器,或者通过Configuration启用全局拦截器请看示例代码

    给hibernate配置文件加密解密的方案

    在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。

    Hibernate的核心API

    主要讲述Hibernate的核心API,幻灯片演示,很清晰。

    hibernate注入的三种方式

    hibernate注入的三种方式

    在hibernate中实现oracle的自动增长

    在hibernate中实现oracle的自动增长

    spring4+hibernate4+springmvc4+ztree+maven

    spring4+hibernate4+springmvc4+ztree+maven nexus管理支持ztree,以及分页,泛型Dao

    深入浅出Hibernate(PDF)第一部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    SpringMVCHibernate实例【含登录拦截器例子】

    JavaWeb项目,SpringMVCHibernate实例【含登录拦截器例子】

    深入浅出Hibernate.pdf

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出Hibernate中文版 part1

    5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试...

    深入浅出Hibernate(PDF)第二部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    深入浅出hibernate(PDF)第三部分

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    使用Maven Hibernate5 之Spring整合

    配事务就陪事务为啥要配拦截,配拦截就配拦截为啥要配自动代理。都是因为楼主是java菜鸟。不然这些肯定是java方面的常识而已。楼主还是一步一步的来吧,感觉Spring操作Hibernate还是离不开DataSource,SessionFactory...

    Hibernate+中文文档

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...

    Hibernate实战(第2版 中文高清版)

     12.3.2 拦截Hibernate事件   12.3.3 内核事件系统   12.3.4 实体监听器和回调   12.4 小结   第13章 优化抓取和高速缓存   13.1 定义全局抓取计划   13.1.1 对象获取选项   13.1.2 延迟的默认抓取...

    中文 深入浅出Hibernate

    直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...

    spring hibernate 日志管理插件

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    hibernate3.2中文文档(chm格式)

    12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5...

Global site tag (gtag.js) - Google Analytics