当我在postgres中存储数据(使用jpa lazy load)和在mongodb中存储javers时,我有一个异常“entity_instance_with_null_id”
弹簧靴:1.4.0.释放
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
query-so-typename+实体id查找以前的版本。
这就是实体的id不能为空的原因。
有两种可能性:
如果空id在这个类中是正常的(根据您的域模型),那么您应该在javers中将它映射为ValueObject。
如果您使用的是hibernate,则延迟加载代理存在常见问题。对于某些查询,hibernate不返回真正的域对象,而是返回本质上为空的动态代理对象(因此id为空)。这种技术看起来可能很聪明,但会使对象成为垃圾,直到它们被hibernate初始化。
javers提供HibernateUnproxyObjectAccessHook来执行清理:初始化和取消域对象的代理。
javersbuilder.javers().withobjectaccesshook(
新建HibernateUpProxy对象访问挂钩()).build()
默认情况下,此挂钩在javers-spring-boot-starter-sql
中启用,但在javers-spring-boot-starter-mongo
中不启用。如果您使用的是mongo starter,请在启用hook的情况下自行创建一个javers bean,请参见JaversMongoAutoConfiguration。
关于mongodb - 使用2个数据库时,Javers ENTITY_INSTANCE_WITH_NULL_ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39671954/