java Web 怎么记录修改的历史(包括字段的原始值和新值)

问题描述

用Spring来开发一个WEb系统。比如:现在实体 Problem,Problem有一下属性:Cateory,Title,description。需求是可以更新Problem的数据库记录,但是,用户可以在页面上看到这个Problem的历史记录,需要看到具体被修改属性的原始值跟新的值。没有好的设计思路。求解。。。

解决方案

看到这个需求,我第一反应是设计在java层做更新记录好像更方便。不需要任何其他知识点了。数据库加一张表就行,比如名叫record表里面 entry property old new date 类似这么几个字段,java层再加一个这个表对应的实体类Record,并且有一个insert方法在Problem的update方法里,很容易能获取到这几个值,update成功以后创建一个Record对象insert到表里。 这样做的好处是可以收集任意一个实体类的修改记录,可能有User,Person等等。查询的时候根据entry name这个字段来区分。这样无论多少次修改,都能保存直观的历史记录。至于这样污染了update的代码,你可以思考下依靠spring的aop编程,比如后置通知之类的,将比较新老值,组装成Record对象等逻辑,分离到一个通用、独立的方法里。其实这一点还是需要思考一下,如果才能更优雅地实现。
解决方案二:
两种方式,一种是简历一张和原表一样的表,对每个可能修改的字段列增加一个修改值的列,再增加一个字段是版本号,这样可以随意调取任何一个版本的记录,速度快,缺点是不可复用,只能针对某一个表,如果你的原表是主子表,那你新增的表就要和原表的结构一样,比较比如原表是合同表,有合同项子表,有订单子表,你都要一一复制。第二种是使用修改表,建一张修改记录主表,记录修改时间,修改人,审核人等主信息,配一张修改项子表,记录修改的表名或者对象名,对象主键id,修改的对象的属性名,原值,修改值,如果是子对象,可以在对象名和对象id上拼接。这种方式适用比较多的情况,具有通用性,但是调取任何一个版本,你需要一个复原引擎,读取你指定版本之后每一个版本,进过处理才能还原到指定版本。两种方式的选择需要自己判断一下需求,选择适合自己的方式,至于到底是触发器控制,还是对修改逻辑进行监控就没那么重要了。
解决方案三:
如果是新建一个历史表,每次复制,这样能查询出历史版本,但是如果要知道修改的字段,还需要 取出数据对比才知道,如果新建的表是记录 old值与new值的这种表,那么就很方便查看修改前的值与修改后的值,但这种方式不能查看历史某一版本的全部数据,根据需求把握,我以前是用的第二种方案,记录 用户修改属性,然后让管理员审核,可以只通过部分字段或者驳回部分字段。
解决方案四:
可以创建一个与原表结构相同的历史表,可以比原表多一些数据操作的标记字段,然后对原表添加Trigger,在原表进行Update,Insert,Delete操作的时候向历史表添加数据(可以考虑同时添加Before Image和After Image).Trigger可以做得更简单一些。假设原表的表名是TBL_AAA,有若干列A1,A2...,那么Audit表就可以为AUD_AAA,设有A1,A2...,AUDIT_DT,AUDIT_MODE,AUD_IMG_TYPE; CREATE OR REPLACE TRIGGER TRI_AAA AFTER INSERT OR UPDATE ON TBL_AAA REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE auditMode VARCHAR2 (6); curr_date date; BEGIN IF UPDATING THEN auditMode := 'update'; ELSIF INSERTING THEN auditMode := 'insert'; END IF; curr_date:=sysdate; IF UPDATING THEN insert into AUD_AAA ( A1, A2, ., ., ., AUDIT_MODE, AUD_IMG_TYPE, AUDIT_DT ) values ( :OLD.A1, :OLD.A2, :OLD.., :OLD.., :OLD.., auditMode, 'before', curr_date ); END IF; IF INSERTING or UPDATING THEN insert into AUD_AAA ( A1, A2, ., ., ., AUDIT_MODE, AUDIT_IMG_TYPE, AUDIT_DT ) values ( :NEW.A1, :NEW.A2, :NEW.., :NEW.., :NEW.., .auditMode, 'after', curr_date ); END IF; EXCEPTION WHEN OTHERS THEN RAISE; END;
解决方案五:
1、版本号每修改一下 复制一条记录 并版本号+12、历史表可以通过如下完成复制:1、触发器2、应用程序内
解决方案六:
可以考虑分表,一个历史表一个原始表,每次更新的时候将原始数据存到历史表中,然后在更新原始表

时间: 2024-10-27 20:21:02

java Web 怎么记录修改的历史(包括字段的原始值和新值)的相关文章

java web 开发 增加 /修改 Dialog问题

问题描述 java web 开发 增加 /修改 Dialog问题 现在看到很多系统增加/修改都采用这样的实现方式,如图:增加 和修改后都可以回到原来的页面 还进行了刷新 请各位指点一下 ,如有类似的功能源码 请各位慷慨发送:626051569@qq.com,谢谢! 解决方案 Java web 开发中文乱码问题 解决方案二: Ajax异步处理可以实现

借助 AOP 为 Java Web 应用记录性能数据

作为开发者,应用的性能始终是我们最感兴趣的话题之一.然而,不是所有的开发者都对自己维护的应用的性能有所了解,更别说快速定位性能瓶颈并实施解决方案了. 2015 年北京 Velocity 的赞助商大多从事 APM 领域,提供性能剖析.可视化甚至优化的解决方案.这些厂商的产品看起来能够很好地帮助中小企业的开发者解决应用性能上的缺陷,但是这些产品几乎都有着一个致命的缺陷:极强的侵入性. 开发者需要在业务生产代码中嵌入 APM 厂商提供的埋点代码,才能够使用 APM 厂商提供的 SaaS 服务.在瞬息万

java web开发,怎么实现用户后台修改网站常量

问题描述 java web开发,怎么实现用户后台修改网站常量 如实现后台能修改数据库连接,网站部署路径,css等资源目录等内容,求demo. 解决方案 帮顶 如实现后台能修改数据库连接,网站部署路径,css等资源目录等内容, demo

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Sp

本文为原创,如需转载,请注明作者和出处,谢谢! 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23   图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.对 AJ

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Spring+Ajax (附源代码)

本文为原创,如需转载,请注明作者和出处,谢谢! 源代码下载 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23 图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.

Java Web技术经验总结(四)

Spring MVC中返回JSON数据的不同方法 Spring 3 MVC ContentNegotiatingViewResolver example,该视图解析器,可以用于将同一份模型数据展现为不同的表现形式,例如JSON.XML和RSS等: 利用@ResponseBody注解修饰控制器方法,并在xxx-servlet.xml中开启spring mvc支持--<mvc: annoation-driven/>,这种机制背后的原理是MessageConverter. 最近用Mockito写单元

java web开发 高并发处理

java 高并发 java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据)  一:高并发高负载类网站关注点之数据库  没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的

Tomcat与Java Web开发技术详解连载之二

web|详解 2.2.4 部署HTML文件 在helloapp目录下加入index.htm文件,这个文件仅仅用来显示一串带链接的字符"Welcome to HelloApp", 它链接到login.jsp文件.以下是index.htm文件的代码: <html><head><title>helloapp</title></head><body ><p><font size="7"

Java Web中的入侵检测及简单实现

web 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据.当然,入侵检测可以用很多方法实现,包括软件.硬件防火墙,入侵检测的策略也很多.在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御. 该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新. 我们的入侵