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

标签 mongodb postgresql spring-boot spring-data-jpa javers

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

Spring Boot:1.4.0.RELEASE

Sprig 数据 JPA:1.4.0.RELEASE

哈弗斯:2.3.0

我调试发现,如果对象是惰性对象,ID 为空: org.javers.core.metamodel.type.EntityType:88 “对象 cdoId = getIdProperty().get(实例);”

最佳答案

当您将一个对象提交给 JaVers 时,它的先前版本将从 JaversRepository 加载并与当前版本(您刚刚传递给 commit() 方法的那个版本)进行比较。 在这种情况下,JaVers 使用 GlobalId 查询找到以前的版本,因此 TypeName + 实体 ID。 这就是实体的 ID 不能为 null 的原因。

有两种可能:

  1. 如果空 ID 在此类中是正常的(根据您的域模型),您应该将其映射为 ValueObject在 JaVers 中。
  2. 如果您使用的是 Hibernate,则延迟加载代理存在常见问题。对于某些查询,Hibernate 不会返回您的真实域对象,而是返回本质上为空的动态代理对象(因此 ID 为空)。这种技术可能看起来很聪明,但在 Hibernate 初始化它们之前会使您的对象成为垃圾。 JaVers 提供 HibernateUnproxyObjectAccessHook清理工作:初始化和取消代理域对象。

    JaversBuilder.javers().withObjectAccessHook( 新的 HibernateUnproxyObjectAccessHook()).build()

此 Hook 在 javers-spring-boot-starter-sql 中默认启用,但在 javers-spring-boot-starter-mongo 中未启用。如果您使用的是 Mongo starter,请自行创建一个 JaVers bean,并启用 Hook ,请参阅 JaversMongoAutoConfiguration .

关于mongodb - 使用 2 个数据库时的 Javers ENTITY_INSTANCE_WITH_NULL_ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39671954/

相关文章:

Spring Boot 和 MongoDB - 如何保存日期

javascript - 在投影字段中使用 $elemMatch - 未根据需要进行过滤

java - 将 mongodb 查询结果转换为 java 中的数据模型类

mongodb - 使用Spring数据在Mongo Db集合中的某个字段查询时如何查找重复项

performance - 带 groupBy 的子查询比通过连接查询慢得多

python - django 唯一对象(不是唯一字段)?

spring-boot - 要让Spring Boot应用程序通过AWS SES发送简单的电子邮件,需要执行哪些配置步骤?

javascript - 从 Node HTTP 请求中运行的算法需要更长的时间来运行

sql - 如何通过接受 NULL 值的查询进行 PARTITION BY?

spring - 从 Spring boot 1.2 升级到 1.5.2 后,Tomcat 8.5 启动期间出现 FileNotFoundException