一、JaVers简介
-
JaVers是一个审核日志框架,可帮助跟踪应用程序中实体的更改。
-
Javers会使用四张表来记录数据的变更
1.jv_snapshot
主要用来存储对象的每次变更操作以及变更的属性值。
2.jv_global_id
存储每次变更的id
3.jv_commit
存储每次变更的时间、变更人
(支持自动从SpringSecurity获取auditor)
4.jv_commit_property
用来存储额外的信息,比如存储了用户id,顺带存储一下用户名等
这四张表可以指定创建的数据库位置,但是无法进行其它的定制化
二、javers使用
引入依赖
<!--JaVers-->
<dependency>
<groupId>org.javers</groupId>
<artifactId>javers-spring-boot-starter-sql</artifactId>
<version>6.8.0</version>
</dependency>
指定日志表的创建位置(默认创建在当前服务所指定的数据库中)
@Component
public class JaverSqlConncetConfig extends JpaHibernateConnectionProvider {
final Connection dbConnection;
{
try {
dbConnection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/my_data?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true", "root", "123456");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Connection getConnection() {
return dbConnection;
}
}
结合SpringSecurity可以记录下数据变更的操作人员
@Component
public class CustomAuthProvider implements AuthorProvider {
@Override
public String provide() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (Objects.isNull(authentication)){
return "unauthenticated";
}
SecurityUserInfo userInfo = (SecurityUserInfo) authentication.getPrincipal();
return userInfo.getNickName();
}
}
记录操作人员的额外一些信息
@Component
public class CustomCommitPropertiesProvider implements CommitPropertiesProvider {
@Override
public Map<String, String> provide() {
Map<String, String> map = new HashMap<>();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (Objects.isNull(authentication)){
return null;
}
SecurityUserInfo userInfo = (SecurityUserInfo) authentication.getPrincipal();
map.put(userInfo.getRealName(),userInfo.getPhone());
return map;
}
}
注解的使用
@Id
该注解加在Entity实体的属性上,
@Id表明了当前属性是唯一标识,javers通过该唯一标识判断是否为同一个对象
@DiffIgnore
该注解加在Entity实体的属性上,
在entity中忽略指定字段的变更
@JaverSpringDataAuditable
该注解加载实体类对应的Repository上,
通过Repository中的方法变更数据,变更记录就会保存在javers创建的表格中
@JaversAuditabe
该注解加在Repository的中的方法上
通过该方法变更数据,变更记录就会保存在javers创建的表格中
三、javers总结
javers可以方便的记录数据变更的时间和操作人员信息
但是数据记录在javers指定的表格中,表格无法进行额外的定制化
而且javers只能记录通过Repository进行数据变更记录,当前项目中使用的JpaQueryFactory变更的记录javers无法识别
网上关于javers的使用用例也比较少
所以javers用在某一个服务中记录某些特定数据的变更还是比较方便的
但是整合出一个服务出来记录所有数据的变更可能不是很好用
行额外的定制化
而且javers只能记录通过Repository进行数据变更记录,当前项目中使用的JpaQueryFactory变更的记录javers无法识别
网上关于javers的使用用例也比较少
所以javers用在某一个服务中记录某些特定数据的变更还是比较方便的
但是整合出一个服务出来记录所有数据的变更可能不是很好用