问题标签 [javers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
468 浏览

java - Javers - 禁用 sql 模式

在 Javers 和 Spring 中,是否可以禁用自动创建 sql 模式?所以我可以使用 Liquibase 创建架构以使用多租户

0 投票
2 回答
463 浏览

javers - 清除旧数据的能力

是否可以清除 Javers 中的历史数据?

假设我对保留任何超过一年(月等)的审计数据没有兴趣。

我在 Javers 中找不到任何类似的 API,但至少理论上有可能从 SQL 存储或 Mongo DB 中手动删除旧记录吗?Javers API 会继续以可预测的方式工作吗?

0 投票
1 回答
185 浏览

javers - Javers - 选择要比较的属性

有没有办法比较两个对象只选择我想要的属性?我知道我们可以使用忽略机制,但如果它是一个大对象,我将需要忽略许多属性,在这种情况下,最好的选择是只选择我们想要的。

有什么线索吗?

谢谢,

0 投票
0 回答
562 浏览

hibernate-envers - 递归比较 - Hibernate Audit 对象 + Javers

我有以下简单的数据模型:

测试用户:

测试用户地址:

我执行了一项操作来更新 TestUserAddress 对象 - 例如我更改了 TestUserAddress 名称:

我开发了一些代码来比较 TestUser 对象,如下所示:

但上面的代码没有显示为 TestUserAddress 所做的更改。如果我运行以下代码:

diff2 变量向我展示了为 TestUserAddress 所做的所有更改,但是我想compare对根对象执行操作以获取对象字段和所有子对象的完整列表。

你知道我该怎么做吗?

我将不胜感激。谢谢你。

0 投票
1 回答
252 浏览

spring - JaversSqlAutoConfiguration.javers() 没有被调用

语境

我已经用于@TypeName("Employee")我的实体,所以我可以在 DB 中丢失完全限定的 TypeName。它按预期工作。

问题

当 Spring boot 应用程序重新启动并且存在现有的审计日志时,当我点击时出现TYPE_NAME_NOT_FOUND异常javers.findSnapshots()

org.javers.common.exception.JaversException: TYPE_NAME_NOT_FOUND type name 'Employment' not found. If you are using @TypeName annotation, remember to register this class using JaversBuilder.scanTypeName(Class). See also https://github.com/javers/javers/issues/263

到目前为止我的方法

  • 我已经添加了JaversSqlAutoConfiguration.java,调用它MyJaversSqlAutoConfiguration
  • 然后我添加scanTypeName(Employee.class)MyJaversSqlAutoConfiguration.javers().

观察

  • 我注意到MyJaversSqlAutoConfiguration.javers(connectionProvider)没有被击中。但是,org.javers.spring.boot.sql.JaversSqlAutoConfiguration.javers()在调试模式下会被击中。MyJaversSqlAutoConfiguration' gets hit. But notMyJaversSqlAutoConfiguration.javers(ConnectionProvider connectionProvider)中的 commitPropertiesProvider() 和 springSecurityAuthorProvider() 。

经过仔细检查,我发现org.javers.spring.boot.sql.JaversSqlAutoConfiguration.javers()没有@ConditionalOnMissingBeanbut commitPropertiesProvider()and springSecurityAuthorProvider()do。

问题

在某处是否有此 scanTypeName() 的工作示例,或者我们应该添加@ConditionalOnMissingBean?

0 投票
1 回答
192 浏览

java - 如何用树格式计算差异

嗨,我想显示这样的差异,我想知道 Javers 的最佳方法是什么:

举个例子:

我想得到类似的东西:

我不是在寻找最终的解决方案,而是更多的线索来看看我需要在哪里插入我的代码:

  • 我需要实现我自己的访问者吗
  • 加上自定义 ChangeProcessor
  • ...

提前谢谢。

克里斯托夫

0 投票
2 回答
2582 浏览

javers - org.hibernate.proxy.HibernateProxy。忘记注册类型适配器?

我们正在尝试使用 Oracle 和基于 Hibernate/JPA(非弹簧)的应用程序来设置 javers 2.2.2。

使用内部存储库和标准(非事务性)构建器时,我能够成功记录和检索审计对象。但是,当我在切换到带有 SQL 的事务生成器后进行保存时,我得到了下面的堆栈跟踪。如果重要的话,我们确实在做 Hibernate Access Hook。

任何帮助是极大的赞赏!

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter? at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:76) at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:69) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:93) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240) at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) at com.google.gson.Gson.toJson(Gson.java:652) at com.google.gson.Gson.toJsonTree(Gson.java:545) at com.google.gson.Gson.toJsonTree(Gson.java:524) at com.google.gson.Gson$2.serialize(Gson.java:137) at org.javers.core.json.typeadapter.commit.CdoSnapshotStateTypeAdapter.toJson(CdoSnapshotStateTypeAdapter.java:31) at org.javers.core.json.typeadapter.commit.CdoSnapshotStateTypeAdapter.toJson(CdoSnapshotStateTypeAdapter.java:14) at org.javers.core.json.JsonConverterBuilder$1.serialize(JsonConverterBuilder.java:124) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:70) at com.google.gson.TreeTypeAdapter.write(TreeTypeAdapter.java:63) at com.google.gson.Gson.toJson(Gson.java:652) at com.google.gson.Gson.toJson(Gson.java:631) at com.google.gson.Gson.toJson(Gson.java:586) at com.google.gson.Gson.toJson(Gson.java:566) at org.javers.core.json.JsonConverter.toJson(JsonConverter.java:55) at org.javers.repository.sql.repositories.CdoSnapshotRepository.insertSnapshot(CdoSnapshotRepository.java:37) at org.javers.repository.sql.repositories.CdoSnapshotRepository.save(CdoSnapshotRepository.java:27) at org.javers.repository.sql.JaversSqlRepository.persist(JaversSqlRepository.java:63) at org.javers.repository.api.JaversExtendedRepository.persist(JaversExtendedRepository.java:109) at org.javers.core.JaversCore.commit(JaversCore.java:79) at org.javers.core.JaversCore.commit(JaversCore.java:64) at org.javers.spring.jpa.JaversTransactionalDecorator.commit(JaversTransactionalDecorator.java:53)

0 投票
2 回答
3253 浏览

mongodb - 使用 2 个数据库时的 Javers ENTITY_INSTANCE_WITH_NULL_ID

当我在 Postgres 中存储数据(使用 JPA 延迟加载)并将 javers 存储在 MongoDB 中时,我有这个异常“ENTITY_INSTANCE_WITH_NULL_ID”

Spring Boot:1.4.0.RELEASE

小树枝数据 JPA:1.4.0.RELEASE

贾维斯:2.3.0

如果对象是惰性对象,我调试并看到 ID 为空:org.javers.core.metamodel.type.EntityType:88 "Object cdoId = getIdProperty().get(instance);"

0 投票
1 回答
647 浏览

java - 如何使用 Javers 比较休眠 BO 对象

我的要求是,出于应用程序审计目的,我想比较两个 BO 对象并将 obj diff 作为 Json 字符串返回,以将详细信息存储到审计表中。为了比较对象,我选择了 Javers。就我而言,我已经实现了一个休眠拦截器,它将监视 BO 操作。这部分工作正常。但是当尝试将 BO 对象与 Javers 进行比较时,我会抛出一个名为

这是我的示例休眠结果类

对象比较代码片段

请让我知道如何使用 javers 比较休眠 BO 对象。也可以忽略@id属性吗?

注意:Bo 对象可以null在运行时包含值。

0 投票
2 回答
776 浏览

json - Jackson 不会从 Javers Change 对象转换嵌套的 Java 8 Optional,它有什么特别之处?

我正在尝试通过 REST api 将 Javers 更改列表作为 JSON 发送。虽然 Jackson 可以通过加载相应的模块来处理 Java 8 Optionals,但它无法序列化 Change 对象。当我自己使用 Optionals 创建一个类时,序列化按预期工作。

要重现一个可以运行以下 groovy 脚本:

这输出:

自定义类按预期序列化:

输出:

Javers Change 课程有什么特别之处,Jackson 拒绝序列化 Optionals?