问题标签 [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.
java - Javers - 禁用 sql 模式
在 Javers 和 Spring 中,是否可以禁用自动创建 sql 模式?所以我可以使用 Liquibase 创建架构以使用多租户
javers - 清除旧数据的能力
是否可以清除 Javers 中的历史数据?
假设我对保留任何超过一年(月等)的审计数据没有兴趣。
我在 Javers 中找不到任何类似的 API,但至少理论上有可能从 SQL 存储或 Mongo DB 中手动删除旧记录吗?Javers API 会继续以可预测的方式工作吗?
javers - Javers - 选择要比较的属性
有没有办法比较两个对象只选择我想要的属性?我知道我们可以使用忽略机制,但如果它是一个大对象,我将需要忽略许多属性,在这种情况下,最好的选择是只选择我们想要的。
有什么线索吗?
谢谢,
hibernate-envers - 递归比较 - Hibernate Audit 对象 + Javers
我有以下简单的数据模型:
测试用户:
测试用户地址:
我执行了一项操作来更新 TestUserAddress 对象 - 例如我更改了 TestUserAddress 名称:
我开发了一些代码来比较 TestUser 对象,如下所示:
但上面的代码没有显示为 TestUserAddress 所做的更改。如果我运行以下代码:
diff2 变量向我展示了为 TestUserAddress 所做的所有更改,但是我想compare
对根对象执行操作以获取对象字段和所有子对象的完整列表。
你知道我该怎么做吗?
我将不胜感激。谢谢你。
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 not
MyJaversSqlAutoConfiguration.javers(ConnectionProvider connectionProvider)中的 commitPropertiesProvider() 和 springSecurityAuthorProvider() 。
经过仔细检查,我发现org.javers.spring.boot.sql.JaversSqlAutoConfiguration.javers()
没有@ConditionalOnMissingBean
but commitPropertiesProvider()
and springSecurityAuthorProvider()
do。
问题
在某处是否有此 scanTypeName() 的工作示例,或者我们应该添加@ConditionalOnMissingBean?
java - 如何用树格式计算差异
嗨,我想显示这样的差异,我想知道 Javers 的最佳方法是什么:
举个例子:
我想得到类似的东西:
我不是在寻找最终的解决方案,而是更多的线索来看看我需要在哪里插入我的代码:
- 我需要实现我自己的访问者吗
- 加上自定义 ChangeProcessor
- ...
提前谢谢。
克里斯托夫
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)
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);"
java - 如何使用 Javers 比较休眠 BO 对象
我的要求是,出于应用程序审计目的,我想比较两个 BO 对象并将 obj diff 作为 Json 字符串返回,以将详细信息存储到审计表中。为了比较对象,我选择了 Javers。就我而言,我已经实现了一个休眠拦截器,它将监视 BO 操作。这部分工作正常。但是当尝试将 BO 对象与 Javers 进行比较时,我会抛出一个名为
这是我的示例休眠结果类
对象比较代码片段
请让我知道如何使用 javers 比较休眠 BO 对象。也可以忽略@id
属性吗?
注意:Bo 对象可以null
在运行时包含值。
json - Jackson 不会从 Javers Change 对象转换嵌套的 Java 8 Optional,它有什么特别之处?
我正在尝试通过 REST api 将 Javers 更改列表作为 JSON 发送。虽然 Jackson 可以通过加载相应的模块来处理 Java 8 Optionals,但它无法序列化 Change 对象。当我自己使用 Optionals 创建一个类时,序列化按预期工作。
要重现一个可以运行以下 groovy 脚本:
这输出:
自定义类按预期序列化:
输出:
Javers Change 课程有什么特别之处,Jackson 拒绝序列化 Optionals?