需要实现一个日志审计的功能,从JE上看到了一个帖子,列举了六种方案(帖子的名字叫《JPA + Hibernate 3 CRUD操作历史审计日志的解决方案(附源码)》),这次刚好用的是hibernate做持久化,就选择了event-listener的方式。但是需要进行日志记录的数据,都是没有在前端提供物理删除逻辑的,用的全是置状态的逻辑删除。
示例伪代码如下:
String hql ="update test.Demo set flag := flag where id := id ";
Query query = getSession().createQuery(hql)
.setParameter("flag",DELETE) //DELETE 表示删除状态
.setParameter("id","1001");
int rows = query.executeUpdate();
然后问题出现了:hibernate无法将逻辑删除的日志记录下来。大概看了一下相关的实现代码,QueryImpl.java应该是调用的SessionImpl.java,而SessionImpl.java的该方法实现是这样的:
public int executeUpdate(String query, QueryParameters queryParameters) throws HibernateException {
errorIfClosed();
checkTransactionSynchStatus();
queryParameters.validateParameters();
HQLQueryPlan plan = getHQLQueryPlan( query, false );
autoFlushIfRequired( plan.getQuerySpaces() );
boolean success = false;
int result = 0;
try {
result = plan.performExecuteUpdate( queryParameters, this );
success = true;
}
finally {
afterOperation(success);
}
return result;
}
又看了一些save/update的一些方法,都和Listener相关,那Event-Listener应该是做在SessionImpl类中的。
再大胆猜测一下,和Query相关的应该是HQLQueryPlan.java,Query都没有事件监听器(注:我没有验证是不是这样),想想也合理,从Hibernate的逻辑上讲无法实现对不加任何假设条件的Query的监听。
但是我需要的是一个完整的实现日志审计的方案,总不能对Query的单个对象的修改,物理删除,逻辑删除(修改)就不做日志吧!业务级需要的特殊需求,肯定应该业务级自己实现的,但是在网上没有发现相关的实现思路和示例。没有成熟的借鉴就只好自己先搞一个思路:
1 定义自己的事件和监听;
2 抽取Query方式的单个对象修改,单个对象逻辑删除,单个对象物理删除的方法成通用方法,放在一个基础类中;
3 在抽取的方法上中,添加上监听器方法调用,
4 实现自己的监听,并把实现的类实例,注入到存在通用方法的基础类;
5 实现单对象修改、单对象逻辑删除或物理删除时需要调用基础类中的对应方法;
现在的日志审计应该是基本一致了。一半是用Hibernate本身的机制实现的,一半是借鉴其思想根据具体业务逻辑自定义监听器和事件实现的。构成相对一个完整的业务日志审计功能。
先试试吧,希望能发现更好一点儿的方式......
分享到:
相关推荐
在这个压缩包中,我们有两个核心文件:10.1.4-4.js和debug-event-listener.js,它们可能包含了实现这一功能的具体代码。 首先,让我们深入了解`Debug`对象。在某些环境中,如Chrome开发者工具或Node.js,`Debug`...
$ npm install kktix-event-listener 用法 var kktixEventListener = require ( 'kktix-event-listener' ) ; kktixEventListener ( 'http://reactjs.kktix.cc/events/react9' ) ; //=> 命令行界面 $ npm install -g ...
supervisor-event-listener Supervisor事件通知, 支持邮件, Slack, WebHook 简介 Supervisor是*nix环境下的进程管理工具, 可以把前台进程转换为守护进程, 当进程异常退出时自动重启. supervisor-event-listener监听...
use-typed-event-listener是支持TypeScript的DOM事件侦听器的React Hook 借助TypeScript的帮助,此程序包可以检测元素支持的事件类型,并自动为事件强制转换正确的类型 安装 npm install use-typed-event-listener...
@ use-it / event-listener 提供声明性useEventListener的自定义React Hook。 这个钩子是由的博客文章启发的。 我需要一种方法来简化在自定义钩子中添加和删除事件侦听器的过程。 这导致了Dan和我之间的。 安装 $...
为了实现审计日志,我们需要创建一个审计实体类,它包含如操作用户、操作时间、操作类型(增、删、改)、以及被操作的对象信息。然后,我们可以创建一个切面(Aspect),使用Spring的`@Before`、`@After`或`@Around`...
`ImageButton`是一个特殊的`Button`,它可以显示图像而不是文本。对于`ImageButton`的点击事件,我们可以按照以下步骤进行设置: 1. **创建OnClickListener对象**:首先,我们需要创建一个实现了`OnClickListener`...
顺序消费是Kafka的一个关键概念,尤其在对消息顺序有严格要求的场景下,例如金融交易或日志记录。顺序消费意味着消息会被消费者按照它们被生产者的发送顺序依次处理。 Spring Kafka提供了一种方式来实现顺序消费,...
tetra-listener-vagrant是一个基于Vagrant的项目模板,专门设计用于TETRA-Listener,一个可能用于无线电通信监听或分析的软件工具。这个模板简化了TETRA-Listener的部署过程,使得开发者和IT专业人员能够快速设置一...
dockerhub-webhook-listener, 侦听 DockerHub webhook调用 DockerHub Webhook侦听器这只是一个简单的HTTP服务器设置,用来监听和处理 DockerHub webhook调用。简单的Logger 处理程序和一个稍微复杂的Mailgun 处理...
在Java的Web开发中,Servlet和Listener是两个非常重要的组件,它们构成了动态Web应用程序的核心部分。...这个"Servlet--Listener 各种接口的简单例子"是一个很好的起点,它将引导你一步步探索Servlet监听器的强大功能。
安装npm install event-listener用法var listen = require ( 'event-listener' )// Returns an object with a .remove() methodvar scrollListener = listen ( window , 'scroll' , function ( e ) { // ...} )// ...
标题提到的"keycloak-kafka-event-listener"是一个自定义的事件监听器,它的主要功能是将Keycloak中的所有事件实时地发布到Apache Kafka这个分布式流处理平台。 Apache Kafka是一个高吞吐量、分布式的发布订阅消息...
安装npm install secret-event-listener --save用法const { EventEmitter } = require ( 'events' )const addSecretListener = require ( 'secret-event-listener' )const emitter = new EventEmitter (
【标题】"emr-presto-query-event-listener"是一个专为Amazon EMR设计的插件,它使用Java语言实现,其主要功能是监听并记录Presto查询的事件,以便于进行审计和性能分析。这一插件对于监控Presto查询在EMR集群中的...
官方离线安装包,亲测可用
【tc-init-health-check-listener-7.0.52.zip】是一个开源项目,主要关注的是对Tomcat服务器的健康检查和初始化监听器。这个项目旨在提供一种方式来监控和管理Tomcat服务器的生命周期,确保其在运行过程中能够稳定、...
节点红色贡献时刻 Node-Red节点事件侦听器测试托盘。 安装 在您的Node-RED安装的根目录中运行以下命令 npm install node-red-contrib-vt-event-listener
"event-listener-master"这个压缩包文件可能包含了该程序的源代码,包括HTML、CSS和JavaScript文件。开发者可以通过查看和学习这些代码,理解事件监听器的实现细节,以及如何在实际项目中应用它们。 总结来说,...