JaVers:一个强大的Java版本控制框架


You
You 2024-01-08 20:45:24 69073 赞同 0 反对 0
分类: 资源
JaVers:一个强大的Java版本控制框架 引言 JaVers是一个开源的Java版本控制框架,旨在帮助开发者更轻松地管理和跟踪应用程序中的对象版本。它提供了一种简单且强大的方式来处理对象的创建、修改和删除,以及版本控制和历史记录。JaVers适用于各种应用程序,包括但不限于Web应用程序、桌面应用程序和移动应用程序。 JaVers使用场景 版本控制:JaVers可以帮助开发者对应用程序中的对象进行版本控制,以便更好地跟踪和管理对象的修改历史。 事务管理:JaVers提供了一个简单的事务管理API,可以帮助开发者在事务中执行操作并处理异常。 合并冲突:当多个开发者同时对同一对象进行修改时,JaVers可以帮助解决合并冲突,确保数据的一致性。 数据库迁移:使用JaVers,开发者可以轻松地将对象从旧版本迁移到新版本,而无需手动处理复杂的数据库迁移过程。

 

JaVers:一个强大的Java版本控制框架

引言

JaVers是一个开源的Java版本控制框架,旨在帮助开发者更轻松地管理和跟踪应用程序中的对象版本。它提供了一种简单且强大的方式来处理对象的创建、修改和删除,以及版本控制和历史记录。JaVers适用于各种应用程序,包括但不限于Web应用程序、桌面应用程序和移动应用程序。

JaVers使用场景

  • 版本控制:JaVers可以帮助开发者对应用程序中的对象进行版本控制,以便更好地跟踪和管理对象的修改历史。
  • 事务管理:JaVers提供了一个简单的事务管理API,可以帮助开发者在事务中执行操作并处理异常。
  • 合并冲突:当多个开发者同时对同一对象进行修改时,JaVers可以帮助解决合并冲突,确保数据的一致性。
  • 数据库迁移:使用JaVers,开发者可以轻松地将对象从旧版本迁移到新版本,而无需手动处理复杂的数据库迁移过程。

JaVers优缺点

  • 优点:
  • 简单易用:JaVers框架简单易用,学习曲线平缓,开发者可以快速上手。
  • 强大功能:JaVers提供了丰富的功能,如版本控制、事务管理、合并冲突和数据库迁移等。
  • 灵活扩展:JaVers框架具有良好的扩展性,开发者可以根据需要自定义和扩展框架的功能。
  • 社区活跃:JaVers拥有一个活跃的开源社区,可以为开发者提供支持和帮助。
  • 缺点:
  • 技术门槛高:JaVers框架相对较复杂,需要一定的学习成本。对于初学者来说,可能需要花费较长时间来理解和掌握框架的使用。
  • 对数据库性能的影响:JaVers在进行版本控制时需要存储大量的历史数据,这可能会对数据库性能产生一定的影响。在处理大量数据时,需要注意性能优化。
  • 可能产生大量的数据冗余:由于JaVers需要保存对象的完整历史记录,因此可能会产生大量的数据冗余。对于一些不需要长时间保留历史记录的应用场景,使用JaVers可能会浪费存储资源。

JaVers示例代码

下面是两个个简单的JaVers示例代码,展示了如何使用JaVers实现数据比对以及对对象进行版本控制:

首先,需要在项目中引入JaVers的相关依赖,如果需要对结果持久化,还需要额外引入对应的依赖:


    org.javers
    javers-core
    7.3.6


    org.javers
    javers-persistence-sql
    7.3.6
  • Compare

通过JaVers我们可以实现两个值对象的比较,通过下面的示例可以看到效果:

Person p1 = new Person("1","junly",22);
        Person p2 = new Person("2","rose",22);

        Javers javers = JaversBuilder.javers().build();
        Diff diff = javers.compare(p1, p2);

        if (diff.hasChanges()) {
            Changes changes = diff.getChanges();
            changes.forEach(change->{
                System.out.println(change.toString());
            });
        }

        System.out.println( diff.prettyPrint() );

执行上面的代码,会得到如下的输出,反映了一个对象修改前后具体属性进行了怎样的变化,之前做的数据采集的项目中,用户提交的数据是一个大json对象, 由于用户可以进行多次修改,但又需要记录每次修改的明细,如果自己写功能则需要写大量的代码来处理,而JaVers可以帮助开发者完美解决了这类问题。

ValueChange{ property: 'id', left:'1',  right:'2' }
ValueChange{ property: 'name', left:'junly',  right:'rose' }
Diff:
* changes on com.sucl.blog.tool.javers.entity.Person/ :
  - 'id' changed: '1' -> '2'
  - 'name' changed: 'junly' -> 'rose'
  • Commit

通过Commit我们可以实现对对象进行版本控制,通过下面的示例可以看到效果:

public static void main(String[] args) {
        Javers javers = JaversBuilder.javers().build();

        Person p1 = new Person("1","junly",22);
        javers.commit("u1", p1);

        Person p2 = new Person("1","junly",20);
        javers.commit("u1", p2);

        Person p3 = new Person("1","tom",22);
        javers.commit("u1", p3);

        JqlQuery query = QueryBuilder.byInstanceId("1", Person.class).build();

        System.out.println("===========================");
        //
        List shadows = javers.findShadows(query);
        shadows.forEach(shadow-> System.out.println( shadow.get() ));

        System.out.println("===========================");
        //
        List snapshots = javers.findSnapshots(query);
        snapshots.forEach(snapshot-> System.out.println( snapshot.getChanged() ));

        System.out.println("===========================");
        //
        Changes changes = javers.findChanges(query);
        changes.forEach(change-> System.out.println( change.toString() ));
}

通过上面的例子,我们可以借用JaVers对对象进行版本控制,并可以获取到对象历史数据。在实体变化时记录历史版本、变更过程以及变化明细。

===========================
Person(id=1, name=tom, age=22)
Person(id=1, name=junly, age=20)
Person(id=1, name=junly, age=22)
===========================
[name, age]
[age]
[name, id, age]
===========================
ValueChange{ property: 'name', left:'junly',  right:'tom' }
ValueChange{ property: 'age', left:'20',  right:'22' }
ValueChange{ property: 'age', left:'22',  right:'20' }
NewObject{ new object: com.sucl.blog.tool.javers.entity.Person/1 }
InitialValueChange{ property: 'id', left:'',  right:'1' }
InitialValueChange{ property: 'name', left:'',  right:'junly' }
InitialValueChange{ property: 'age', left:'',  right:'22' }

Process finished with exit code 0

Shadow和Changes是JaVers提供的两种查询方式,通过它们可以获取到实体的历史版本。

Snapshot是JaVers提供的一种查询方式,通过它可以获取到实体的历史版本。

JaVers还提供了JQL查询语言,可以帮助开发者实现对数据库的各种查询,比如基于变化的属性、提交人、时间等等。

JaVers持久化

JaVers提供了两种持久化方式,一种是内存持久化,另一种是数据库持久

目前可以支持的数据库有:

  • H2
  • MySQL
  • PostgreSQL
  • Oracle
  • SQL Server
  • MongoDB

在上面的例子当中,你可以通过配置Repository来实现变更过程的持久化,例如使用Mysql数据库,可以配置如下:

JaversRepository javersRepository = SqlRepositoryBuilder.sqlRepository()
        .withConnectionProvider(()-> getConnection())
        .withDialect(DialectName.MYSQL)
        .build();

Javers javers = JaversBuilder.javers()
        .registerJaversRepository(javersRepository)
        .build();

这样我们通过JQL查询就可以按需获取更多的历史数据了。

结束语

Javers在做数据对比以及数据变更追踪的过程中,提供了丰富的功能,如版本控制、事务管理、合并冲突和数据库迁移等。同时,JaVers的扩展性也非常好,开发者可以根据需要自定义和扩展框架的功能。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
YouL0
粉丝 0 资源 386 + 关注 私信
最近热门资源
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD  80
以openkylin为例编译安装内核  75
分享解决宏碁电脑关机时自动重启的方法  72
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作  63
统信uosboot区分未挂载导致更新备份失败  62
统信uos安装mysql的实例参考  59
格之格打印机dp3300系列国产系统uos打印机驱动选择  57
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。  51
MySQL国产平替最佳选择---万里数据库(GreatDB)  45
最近下载排行榜
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD 0
以openkylin为例编译安装内核 0
分享解决宏碁电脑关机时自动重启的方法 0
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作 0
统信uosboot区分未挂载导致更新备份失败 0
统信uos安装mysql的实例参考 0
格之格打印机dp3300系列国产系统uos打印机驱动选择 0
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。 0
MySQL国产平替最佳选择---万里数据库(GreatDB) 0
作者收入月榜
1

prtyaa 收益400.83元

2

zlj141319 收益237.91元

3

哆啦漫漫喵 收益231.52元

4

IT-feng 收益219.92元

5

1843880570 收益214.2元

6

风晓 收益208.24元

7

777 收益173.17元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!