当前位置: 首页 > news >正文

鹤岗市网站建设_网站建设公司_版式布局_seo优化

网站开发和软件开发工作,德州网络推广培训,手游平台怎么搭建,万网域名注册备案数据审计是业务系统的一个基本能力#xff0c;需要系统能够将关键数据的变动纪录都保存下来#xff0c;并支持变动纪录的查询。 通过spring-data-envers可以很容易的实现数据变动纪录的保存和查询。 有些情况下#xff0c;我们需要只保存满足特定条件的数据变动纪录#…数据审计是业务系统的一个基本能力需要系统能够将关键数据的变动纪录都保存下来并支持变动纪录的查询。 通过spring-data-envers可以很容易的实现数据变动纪录的保存和查询。 有些情况下我们需要只保存满足特定条件的数据变动纪录不满足条件的变动纪录不进行保存例如只保存某个字段有值的变动纪录。 本文介绍支持有条件变动纪录的保存和查询的方法。 具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-data-envers-conditional 一、概述 可以通过 spring-data-envers 很容易的实现变动纪录的保存和查询只需要增加几个注解就可以。但是要实现有条件的变动纪录的保存和查询就需要进行一些复杂的处理。 二、使用 spring-data-envers 首先引入 spring-data-envers 依赖。 在 build.gradle 中增加一行代码: implementation org.springframework.data:spring-data-envers在实体类上增加 Audited 注解 Data Entity Audited public class MyData {IdGeneratedValueprivate Long id;private String author; }Repository 扩展 RevisionRepository 方法 public interface MyDataRepository extends JpaRepositoryMyData, Long, RevisionRepositoryMyData, Long, Integer { }通过以上3步操作就添加好了变动纪录的保存功能我们可以通过调用变动纪录查询方法确认变动纪录保存成功。 当 Repository 扩展 RevisionRepository 方法后会有一个默认实现的 findRevisions 方法我们可以直接调用 public RevisionsInteger, MyData findRevisions(Long id) {return myDataRepository.findRevisions(id); }最后我们可以执行完整的主体数据的保存在控制台中打印变动纪录 Override public void run(String... args) {MyData myData new MyData();myData.setId(1L);myData.setAuthor(test);dbService.saveData(myData);dbService.findRevisions(myData.getId()).forEach(r - System.out.println(revision: r.toString()));myData.setAuthor(newAuthor);dbService.saveData(myData);dbService.findRevisions(myData.getId()).forEach(r - System.out.println(revision: r.toString())); }执行完程序后可以看到两次保存数据的操作都可以查询到对应的变动纪录并且变动纪录还通过 revisionType 显示了是插入还是更新操作 revision: Revision 1 of entity MyData(id1, authortest) - Revision metadata DefaultRevisionMetadata{entityDefaultRevisionEntity(id 1, revisionDate Oct 15, 2023, 11:41:15 AM), revisionTypeINSERT} revision: Revision 2 of entity MyData(id1, authornewAuthor) - Revision metadata DefaultRevisionMetadata{entityDefaultRevisionEntity(id 2, revisionDate Oct 15, 2023, 11:41:16 AM), revisionTypeUPDATE}三、通过自定义 Event Listener 实现有条件的变动纪录的保存 在进行数据变动时 Envers 通过监听事件来进行对应的处理总共有以下几个监听事件 EventType.POST_INSERT EventType.PRE_UPDATE EventType.POST_UPDATE EventType.POST_DELETE EventType.POST_COLLECTION_RECREATE EventType.PRE_COLLECTION_REMOVE EventType.PRE_COLLECTION_UPDATE每个监听事件都对应着特定的 Listener 在本文实例中我们期望当 author 的值被更新为空时不保存变动纪录我们可以通过自定义 PRE_UPDATE 和 POST_UPDATE 的Listener来实现。 因为框架提供了默认的Listener因此自定义 Listener 只需要扩展默认的Listener并加入我们自己的特有逻辑就可以。 MyEnversPostUpdateEventListenerImpl public class MyEnversPreUpdateEventListenerImpl extends EnversPreUpdateEventListenerImpl {public MyEnversPreUpdateEventListenerImpl(EnversService enversService) {super(enversService);}Overridepublic boolean onPreUpdate(PreUpdateEvent event) {if (event.getEntity() instanceof MyData ((MyData) event.getEntity()).getAuthor() null) {return false;}return super.onPreUpdate(event);}}MyEnversPostUpdateEventListenerImpl: public class MyEnversPostUpdateEventListenerImpl extends EnversPostUpdateEventListenerImpl {public MyEnversPostUpdateEventListenerImpl(EnversService enversService) {super(enversService);}Overridepublic void onPostUpdate(PostUpdateEvent event) {if (event.getEntity() instanceof MyData ((MyData) event.getEntity()).getAuthor() null) {return;}super.onPostUpdate(event);} }在自定义 Listener 中我们增加了 对于 author 字段是否为空的判断逻辑。 四、自定义 Event Listener 注册到系统中 自定义 Event Listener 完成后我们还需要让框架执行我们自定义的 Listener 而不是用默认的 Listener。 框架通过 EnversIntegrator 类注册的 Listener, 我们要做的是重新实现 EnversIntegrator , 在本实例中重新实现的类为 MyEnversIntegrator : public class MyEnversIntegrator implements Integrator {Overridepublic void integrate(Metadata metadata,BootstrapContext bootstrapContext,SessionFactoryImplementor sessionFactory) {final ServiceRegistry serviceRegistry sessionFactory.getServiceRegistry();final EnversService enversService serviceRegistry.getService(EnversService.class);final EventListenerRegistry listenerRegistry serviceRegistry.getService(EventListenerRegistry.class);listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);if (enversService.getEntitiesConfigurations().hasAuditedEntities()) {listenerRegistry.appendListeners(EventType.POST_DELETE,new EnversPostDeleteEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.POST_INSERT,new EnversPostInsertEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.PRE_UPDATE,new MyEnversPreUpdateEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.POST_UPDATE,new MyEnversPostUpdateEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE,new EnversPostCollectionRecreateEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE,new EnversPreCollectionRemoveEventListenerImpl(enversService));listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE,new EnversPreCollectionUpdateEventListenerImpl(enversService));}}Overridepublic void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {// nothing to do} }通过代码可以发现我们只是修改了 PRE_UPDATE 和 POST_UPDATE 注册的 Listener , 其它事件的 Listener 仍然用框架默认的。 最后我们需要把我们实现的 MyEnversIntegrator 放到 META-INF/services/org.hibernate.integrator.spi.Integrator 这个配置文件中。 cn.springcamp.springdata.envers.MyEnversIntegrator五、确认有条件变动纪录的保存是否生效 最后我们修改控制台打印程序将 author 字段更新为 null 并保存查看变动纪录里是否有这个更新操作的纪录。 增加保存代码 : // wont generate audit record when author is null myData.setAuthor(null); dbService.saveData(myData); dbService.findRevisions(myData.getId()).forEach(r - System.out.println(revision: r.toString()));执行程序并观察控制台打印内容 revision: Revision 1 of entity MyData(id1, authortest) - Revision metadata DefaultRevisionMetadata{entityDefaultRevisionEntity(id 1, revisionDate Oct 15, 2023, 11:41:15 AM), revisionTypeINSERT} revision: Revision 2 of entity MyData(id1, authornewAuthor) - Revision metadata DefaultRevisionMetadata{entityDefaultRevisionEntity(id 2, revisionDate Oct 15, 2023, 11:41:16 AM), revisionTypeUPDATE}通过打印内容可以确认author 字段更新为 null 的变动纪录没有被纪录说明我们的处理是生效的。
http://www.ihoyoo.com/news/100431.html

相关文章:

  • 个人建网站简易方法优品ppt官网网址
  • 广州网站开发哪家专业能设计房子的软件
  • 罗湖区做网站的公司怎么推广自己的网站
  • 有什么网站用名字做图片WordPress加载语言包
  • 卖文章的网站源码江苏网站seo设计
  • 乐清做网站的公司有哪些加工平台都有哪些
  • 网站建设管理情况报告个人注册公司的利与弊
  • asp.net网站开发百科百度seo排名公司
  • 西宁软件优化网站建设西安紧急通知
  • 做建材营销型网站wordpress 上传图片大小
  • 企业网站免费推广方案wordpress电影下载站主题
  • 盐城高端网站制作公司网站收录查询
  • 做音乐网站的选题背景基于微信公众号开发网站开发
  • 网站开发未来发展趋势中国建设银行个人网上银行官方网站
  • 网站建设开发感想泰州网页制作
  • 搜素引擎优化南阳做网站优化哪家好
  • 百度网站首页入口大连企业查询
  • 宁波网站排名优化seowordpress 栏目链接地址
  • 郑州贸网站建设公司企业公司网页
  • 网站建设结构方案怎么学做一件完整衣服网站
  • 惠州企业网站设计wordpress百家号主题
  • 做海岛旅游类网站的背景及意义海淀网站建设公司
  • 企业网站 管理seo优化一般包括哪些
  • 网站毕业设计任务书crm客户关系系统
  • 网站建设图片怎么调网站 网页区别是什么
  • 南京网站排名外包网站搭建十大品牌公司
  • 外贸网站建设需要注意事项摄影赚钱的网站
  • wex5做视频网站百度智能门户建站怎么样
  • 中核工建设集团OA网站网站 各种 备案
  • 做普通网站公司吗wordpress验证码失效