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

常见的网站名称有哪些网站搭建修改收费依据

常见的网站名称有哪些,网站搭建修改收费依据,建程网工程信息网,部门网站开发上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计#xff0c;那么如果我们想扩展审计字段呢#xff1f; 比如目前对员工表加入了Audited审计#xff0c;员工表有个字段为dept_id#xff0c;为…上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计那么如果我们想扩展审计字段呢 比如目前对员工表加入了Audited审计员工表有个字段为dept_id为了页面展示更人性化我想把dept_id关联的部门名称当时的快照值也存入审计版本中这样的话在查看员工信息修改历史的时候就可以看到当时员工对应的部门名称了。 我们看看如何把引用的快照信息保存到审计版本记录中经过对spring data envers (基于hibernate envers)的源码阅读发现目前没有可用手段能将额外的自定义审计信息保存到业务表对应的_aud审计表_aud表保存的字段比较固定就是业务表中被审计的字段 审计基础字段(revrevtype, revend, revend_tstmp, 分别为审计版本号、操作类型【增删改】、审计下一个版本号、操作时间戳)。 那么就只能寄希望于审计实体表revinfo了还好hibernate envers给我们留了口子去扩展这个表。 1. 自定义审计实体类表名可以用revinfo也可以用其他的必须要有审计版本/id和操作时间戳两个字段可以自己加入新的字段如下列代码中的extInfo字段。 Entity(name revinfo) //审计实体表名 Getter Setter NoArgsConstructor AllArgsConstructor RevisionEntity(MyRevisionListener.class) //自定义的监听可处理扩展字段保存值 public class MyRevisionEntity {private static final long serialVersionUID 1L;IdGeneratedValueRevisionNumberColumn(name rev)private int revNumb; //审计版本号 必要RevisionTimestampColumn(name revtstmp)private long timestamp; //审计时间 必要Column(name ext, length 1000)private String extInfo; //扩展字段 } 2. 我们看到上面还指定了一个监听类没错我们接下来就要创建这个类并在这个类中定义当保存审计信息时我们要在扩展字段去插入什么值。 网上很多是实现RevisionListener接口这里我建议实现EntityTrackingRevisionListener接口它比RevisionListener更强大多了entityChanged方法可以帮助我们处理更多自定义的业务且不污染业务审计表。 Slf4j public class MyRevisionListener implements EntityTrackingRevisionListener {Overridepublic void newRevision(Object revisionEntity) {//这里可以自行设置业务表中被审计的字段保存何值到DB _aud表字段类型需要与业务表中定义的一致一般为了保持数据一致性这里不做处理}Overridepublic void entityChanged(Class entityClass, String entityName, Object entityId, RevisionType revisionType, Object revisionEntity) {//我们扩展额外的字段及字段值主要是重写这个方法......} } 3. 那么我们如何控制在save员工信息的时候将员工部门名称快照保存到审计实体表revinfo呢 首先你需要通过一些辅助方式将员工表和部门表关联起来如果你们配置了ManyToOne这类注解的话可以读取注解进行操作。如果没有的话建议自定义注解简单配置关联关系即可。 我这里自定义了一个注解AuditedExtInfo可以配置被审计的字段需要保存什么值到revinfo表 AuditedExtInfo(referenceClass Dept.class, displayField name) //自定义注解配置dept_id对应的是哪个实体类、以及保存哪个字段的快照值 Column(name dept_id, length 50) private String deptId; 然后在监听程序中我们通过反射获取到deptId关联的部门对象的名称进行保存 SneakyThrowsOverridepublic void entityChanged(Class entityClass, String entityName, Object entityId, RevisionType revisionType, Object revisionEntity) {//将审计实体对象转换为自定义的审计实体类的对象MyRevisionEntityMyRevisionEntity myRevisionEntity (MyRevisionEntity) revisionEntity;//获取Spring Data JPA的Repository (方便获取实体对象及关联的对象信息)//ApplicationContextHelper.getContext()这个是返回Spring的ApplicationContext的静态方法Repositories repositories new Repositories(ApplicationContextHelper.getContext());//先获取到被审计的业务实体表对象例如我们需要找到此次save操作对应的员工信息从而找到deptIdObject entityRepository repositories.getRepositoryFor(entityClass).orElseThrow(() - new RuntimeException(Not found entityRepository));Object entity ((Optional) MethodUtils.invokeMethod(entityRepository, findById, entityId)).orElse(null);//遍历业务实体表的字段列表找到注解字段信息Field[] fields entityClass.getDeclaredFields();for (Field field : fields) {AuditedExtInfo conversion field.getDeclaredAnnotation(AuditedExtInfo.class);if (Objects.isNull(conversion)) {//如果没有定义AuditedExtInfo注解则忽略此字段continue;}//找到了注解获取该字段的值然后用该字段的值deptId去查部门表的Repository的findById方法找到部门对象String fieldValue String.valueOf(FieldUtils.readDeclaredField(entity, field.getName(), true));Object referenceRepository repositories.getRepositoryFor(conversion.referenceClass()).orElseThrow(() - new RuntimeException(Not found referenceRepository));Object referenceObj ((Optional) MethodUtils.invokeMethod(referenceRepository, findById, fieldValue)).orElse(null);//获取引用对象的相应字段的值进行保存。如部门对象的name值String extInfo String.valueOf(FieldUtils.readDeclaredField(referenceObj, conversion.displayField(), true));//如果此业务实体表要扩展多个字段的引用快照值建议在myRevisionEntity的ext字段保存一个JSON或Map或者定义多个字段 如ext1、ext2、ext3...myRevisionEntity.setExt(extInfo);break;}} 借助Hibernate envers预留的监听接口扩展自己的监听类以及反射操作实体对象和JPA等手段可以在Spring Data JPA进行save操作时保存我们额外的审计字段及字段值。
http://www.zqtcl.cn/news/410518/

相关文章:

  • 南京林业大学实验与建设网站现在都用什么软件搜索附近的人
  • 建站系统wordpress下载亚马逊雨林十大恐怖生物
  • 凡科网做网站怎么样专业团队电影
  • 有什么有趣的网站移动网站排名怎么做
  • 深圳网站建设专家wordpress 4.5下载地址
  • 网站建设公司公司我我提供一个平台wordpress如何去版权信息
  • seo怎么给网站做外链受欢迎的网站建设教程
  • 网站建设使用多语言河南电商网站设计
  • 网站搭建有免费的吗网站地图生成代码
  • 建设公司网站要注意什么投资小利润高的小生意
  • 网站建设需要做哪些工作做胃镜需那好天津津门网站A
  • 做网站申请域名的流程辽宁省工程造价网
  • 网站系统维护一般多长时间金华高端网站设计
  • 做网站公司销售开场白企业网站规划与开发
  • 兰州新区建站不锈钢网站建设
  • 淘宝小网站怎么做的电商网站有哪些
  • 哪些网站可以做画赚钱wordpress go跳转页
  • 怎么做新网站上线通稿深圳罗湖区网站建设公司
  • php 企业网站做网站可以赚钱吗
  • 局域网视频网站建设点播系统长沙3合1网站建设价格
  • 静态网站 服务器合肥做个网站什么价格
  • 宁阳网站设计家电网站设计方案
  • 网站备案icp秦皇岛黄金海岸
  • dedecms 金融类网站模板wordpress dux5.3
  • 学校网站源码wordpress向网站上传文件怎么做
  • 电子商务网站建设说课稿济南网站建设方案报价
  • 谈谈设计和建设网站体会wordpress header在哪
  • 360免费建站怎么进不去域名托管
  • 做网站视频存储网站建设有云端吗
  • 建网站如何上传南通 网站优化