2

Postgres (JPA Lazy Load を使用) にデータを保存し、MongoDB に Java を保存すると、この例外「ENTITY_INSTANCE_WITH_NULL_ID」が発生します。

スプリング ブート: 1.4.0.RELEASE

小枝データ JPA: 1.4.0.RELEASE

ハベル: 2.3.0

デバッグしたところ、オブジェクトが遅延オブジェクトの場合、ID が null であることがわかりました: org.javers.core.metamodel.type.EntityType:88 "Object cdoId = getIdProperty().get(instance);"

4

2 に答える 2

8

オブジェクトを JaVers にコミットすると、その前のバージョンが JavarsRepository からロードされ、現在のバージョン (commit() メソッドに渡したばかりのバージョン) と比較されます。この場合、JaVers はGlobalIdクエリを使用して以前のバージョンを検索するため、TypeName + エンティティ ID になります。そのため、エンティティの ID を null にすることはできません。

次の 2 つの可能性があります。

  1. このクラスで null ID が正常である場合 (ドメイン モデルによると)、JaVersで ValueObject としてマップする必要があります。
  2. Hibernate を使用している場合、プロキシの遅延読み込みに関する一般的な問題があります。特定のクエリでは、Hibernate は実際のドメイン オブジェクトを返しませんが、本質的に空 (したがって null ID) の動的プロキシ オブジェクトを返します。この手法はスマートに見えるかもしれませんが、オブジェクトが Hibernate によって初期化されるまではガベージになります。JaVers は、クリーニング (ドメイン オブジェクトの初期化とプロキシ解除) を行うHibernateUnproxyObjectAccessHookを提供します。

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

このフックは、 ではデフォルトで有効になっていますが、javers-spring-boot-starter-sqlでは無効になっていますjavers-spring-boot-starter-mongo。Mongo スターターを使用している場合は、フックを有効にして独自に JaVers Bean を作成します。 JavarsMongoAutoConfigurationを参照してください。

于 2016-09-25T06:42:14.073 に答える