当我在 Postgres 中存储数据(使用 JPA 延迟加载)并且在 MongoDB 中存储 javers 时,出现此异常“ENTITY_INSTANCE_WITH_NULL_ID”
春季启动:1.4.0.RELEASE
Spring Data JPA:1.4.0.RELEASE
贾弗斯:2.3.0
我调试后发现,如果对象是惰性对象,则 ID 为 null:
org.javers.core.metamodel.type.EntityType:88 "对象 cdoId = getIdProperty().get(instance);"
当您将对象提交到 JaVers 时,将从 JaversRepository 加载其先前版本并与当前版本(您刚刚传递给 commit() 方法的版本)进行比较。
在这种情况下,JaVers 使用以下命令查找以前的版本GlobalId
查询所以TypeName + 实体ID。
这就是实体的 ID 不能为空的原因。
有两种可能:
- 如果空 ID 在此类中是正常的(根据您的域模型),您应该将其映射为值对象 http://javers.org/documentation/domain-configuration/#value-object在贾维尔斯。
-
如果您使用 Hibernate,延迟加载代理会出现常见问题。对于某些查询,Hibernate 不会返回真实的域对象,而是返回本质上为空的动态代理对象(因此为 null ID)。这种技术可能看起来很聪明,但会让你的对象变成垃圾,直到它们被 Hibernate 初始化为止。
JaVers 提供HibernateUnproxyObjectAccessHook http://javers.org/documentation/spring-integration/#hibernate-unproxy-hook它负责清理:域对象的初始化和取消代理。
JaversBuilder.javers().withObjectAccessHook(
新的 HibernateUnproxyObjectAccessHook()).build()
该钩子默认启用javers-spring-boot-starter-sql
但不在javers-spring-boot-starter-mongo
。如果您使用 Mongo starter,请自行创建一个 JaVers bean,并启用钩子,请参阅JaversMongo自动配置 https://github.com/javers/javers/blob/master/javers-spring-boot-starter-mongo/src/main/java/org/javers/spring/boot/mongo/JaversMongoAutoConfiguration.java.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)