使用2个数据库时,Javers ENTITY_INSTANCE_WITH_NULL_ID

Luu*_*uan 2 postgresql mongodb spring-data-jpa spring-boot javers

我在Postgres中存储数据时使用此异常"ENTITY_INSTANCE_WITH_NULL_ID"(使用JPA Lazy Load)并将javers存储在MongoDB中

Spring Boot:1.4.0.RELEASE

Sprig Data JPA:1.4.0.RELEASE

Javers:2.3.0

我调试并看到如果object是一个惰性对象,则ID为null:org.javers.core.metamodel.type.EntityType:88"Object cdoId = getIdProperty().get(instance);"

Bar*_*cik 6

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

有两种可能性:

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

    JaversBuilder.javers().withObjectAccessHook(new HibernateUnproxyObjectAccessHook()).build()

此挂钩默认启用javers-spring-boot-starter-sql但不启用javers-spring-boot-starter-mongo.如果您正在使用Mongo starter,请自行创建一个JaVers bean,并启用该钩子,请参阅JaversMongoAutoConfiguration.