拦截hibernate事件:
例子实现审计日志:
1、创建标记接口
用这个接口给所有应该子被自动审计的持久化类做上标记:
-
-
-
-
-
-
-
-
publicinterfaceAuditable
{
-
publicLong
getId();
-
}
2、创建和映射日志记录
创建新的持久化类AuditLogRecord。这个类标识你想要的审计数据库表中记入日志信息:
-
-
-
-
-
-
-
publicclassAuditLogRecordimplementsSerializable
{
-
privateLong
auditLogId;
-
privateString
message;
-
privateLong
entityId;
-
privateClass
entityClass;
-
privateLong
userId;
-
privateDate
created;
-
-
<classname="AuditLogRecord"table="Audit_Log_Record"mutable="false">
-
<id
name="auditLogId"column="audit_Log_Id"type="long">
-
<generatorclass="native"/>
-
</id>
-
-
<property
name="message"length="200"></property>
-
<property
name="entityId"column="entity_Id"type="long"not-null="true"></property>
-
<property
name="entityClass"column="entity_Class"type="class"not-null="true"></property>
-
<property
name="userId"column="user_Id"type="long"></property>
-
<property
name="created"type="java.util.Date"not-null="true"update="false"></property>
-
</class>
3、编写拦截器
当调用save时(),应该自动调用logEvent()方法。利用hibernate完成实现Interceptor接口。
-
-
-
-
-
-
-
publicclassAuditLogInterceptorextendsEmptyInterceptor
{
-
privateSession
session;
-
privateLong
userId;
-
-
privateSet
inserts =newHashSet();
-
privateSet
updates =newHashSet();
-
-
-
publicvoidsetSession(Session
session) {
-
this.session
= session;
-
}
-
-
publicvoidsetUserId(Long
userId) {
-
this.userId
= userId;
-
}
-
-
-
-
-
-
publicbooleanonFlushDirty(Object
entity, Serializable id,
-
Object[]
currentState, Object[] previousState,
-
String[]
propertyNames, Type[] types) {
-
if(entityinstanceofAuditable){
-
inserts.add(entity);
-
}
-
-
returnfalse;
-
}
-
-
-
-
-
-
publicbooleanonSave(Object
entity, Serializable id, Object[] state,
-
String[]
propertyNames, Type[] types) {
-
if(entityinstanceofAuditable){
-
updates.add(entity);
-
}
-
-
returnfalse;
-
}
-
-
-
-
-
-
publicvoidpostFlush(Iterator
entities)throwsCallbackException{
-
try{
-
for(Iterator
it = inserts.iterator();it.hasNext();){
-
Auditable
auditable = (Auditable) it.next();
-
AuditLog.logEvent("create",auditable,userId,session.connection());
-
}
-
-
for(Iterator
it = updates.iterator();it.hasNext();){
-
Auditable
auditable = (Auditable) it.next();
-
AuditLog.logEvent("update",auditable,userId,session.connection());
-
}
-
}finally{
-
inserts.clear();
-
updates.clear();
-
}
-
-
}
-
-
}
4、启用拦截器
第一次打开会话时,你需要把Interceptor分配到Hibernate Session:
-
publicclassItemDao
{
-
-
publicvoidsaveDao(Item
item){
-
AuditLogInterceptor
interceptor =newAuditLogInterceptor();
-
Session
session = getSessionFactory().openSession(interceptor);
-
Transaction
tx = session.beginTransaction();
-
-
interceptor.setSession(session);
-
interceptor.setUserId(1L);
-
-
session.save(item);
-
-
tx.commit();
-
session.close();
-
}
-
}
AuditLog:
-
publicclassAuditLog
{
-
-
publicstaticvoidlogEvent(String
message, Auditable auditable,
-
Long
userId, Connection connection) {
-
Session
session = getSessionFactory().openSession(connection);
-
-
try{
-
AuditLogRecord
auditLogRecord =newAuditLogRecord(message,
auditable.getId(),
-
auditable.getClass(),
userId,newDate());
-
session.save(auditLogRecord);
-
session.flush();
-
}finally{
-
session.close();
-
}
-
-
}
-
-
}
调用:
-
ItemDao
itemDao =newItemDao();
-
itemDao.saveDao(newItem("hello2"));
-
-
-
-
内核事件系统:
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>
分享到:
相关推荐
使用拦截器时按如下步骤进行: (1)定义实现Interceptor接口的拦截器类 (2)通过Session启用拦截器,或者通过Configuration启用全局拦截器请看示例代码
在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。
主要讲述Hibernate的核心API,幻灯片演示,很清晰。
hibernate注入的三种方式
在hibernate中实现oracle的自动增长
spring4+hibernate4+springmvc4+ztree+maven nexus管理支持ztree,以及分页,泛型Dao
直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
JavaWeb项目,SpringMVCHibernate实例【含登录拦截器例子】
直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
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实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
配事务就陪事务为啥要配拦截,配拦截就配拦截为啥要配自动代理。都是因为楼主是java菜鸟。不然这些肯定是java方面的常识而已。楼主还是一步一步的来吧,感觉Spring操作Hibernate还是离不开DataSource,SessionFactory...
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的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、 ...
12.3.2 拦截Hibernate事件 12.3.3 内核事件系统 12.3.4 实体监听器和回调 12.4 小结 第13章 优化抓取和高速缓存 13.1 定义全局抓取计划 13.1.1 对象获取选项 13.1.2 延迟的默认抓取...
直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截、Hibernate分页等实用技术,Hibernate实战部分则用一个真实论坛...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) ...
9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 9.4.4 直接通过JDBC API来进行批量操作 9.5...