当我在 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 的原因。
有两种可能:
- 如果空 ID 在此类中是正常的(根据您的域模型),您应该将其映射为 ValueObject在 JaVers 中。
如果您使用的是 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/