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

动态ip做网站影响seo吗如何搭建网站平台

动态ip做网站影响seo吗,如何搭建网站平台,在html中做网站 视频,站点推广名词解释上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计,那么如果我们想扩展审计字段呢? 比如目前对员工表加入了Audited审计,员工表有个字段为dept_id,为…

上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。

之前演示的是业务表中已有的字段进行审计,那么如果我们想扩展审计字段呢?

比如目前对员工表加入了@Audited审计,员工表有个字段为dept_id,为了页面展示更人性化,我想把dept_id关联的部门名称(当时的快照值)也存入审计版本中,这样的话,在查看员工信息修改历史的时候,就可以看到当时员工对应的部门名称了。

我们看看如何把引用的快照信息保存到审计版本记录中,经过对spring data envers (基于hibernate envers)的源码阅读,发现目前没有可用手段能将额外的自定义审计信息保存到业务表对应的_aud审计表_aud表保存的字段比较固定,就是业务表中被审计的字段 + 审计基础字段(rev,revtype, 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;@Id@GeneratedValue@RevisionNumber@Column(name = "rev")private int revNumb; //审计版本号 必要@RevisionTimestamp@Column(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关联的部门对象的名称,进行保存:

    @SneakyThrows@Overridepublic 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.hengruixuexiao.com/news/24391.html

相关文章:

  • 天津开发区建设工程管理中心网站营销做得好的品牌
  • 网站建设洛阳短视频矩阵seo系统源码
  • 群辉服务器做网站微信营销软件手机版
  • 谷歌网站提交入口seo赚钱暴利
  • 俄语网站里做外贸shop上海有哪些优化网站推广公司
  • 做网站哪个语言好网站关键词快速优化
  • 类似WordPress的Python广东企业网站seo哪里好
  • 关于加强企业门户网站建设通知投广告的平台有哪些
  • 三站合一的网站怎么做教程怎么去营销自己的产品
  • 网站的三要素关键词大全
  • 自己做网站做外贸可以吗徐州seo推广
  • 学校网站建设与管理中国互联网数据平台
  • 制作企业网站htmlh5页面制作平台
  • 德州聊城网站建设苏州百度推广公司地址
  • 武汉市新洲区做网站百度搜索关键词排名靠前
  • 织梦网站怎么做404页面郑州网站建设哪里好
  • 企业运营仿真大赛网站排名优化方案
  • 凡客诚品售后服务官方百度sem优化师
  • 推荐一个免费的网站软文广告经典案例300字
  • 提交网站seo建站是什么
  • 2017年做那家网站好郑州发布最新通告
  • 石家庄新钥匙网站seo快速排名源码
  • 网站建设宣传文案十大新媒体平台有哪些
  • 郑州东区网站建设网站建设制作过程
  • wordpress怎么播放视频教程seo中文含义
  • 用js做网站的滚屏效果天津百度整站优化服务
  • 牛商网 做的p2p网站sem是什么的缩写
  • 赚钱软件的套路最新seo课程
  • 网站怎么添加广告代码关键词搜索排名怎么查看
  • 域名解析完成网站怎么做自己建网站详细流程