2016-09-24 2 views
1

を使用して、私持っているこの例外「ENTITY_INSTANCE_WITH_NULL_ID」私は(JPAレイジーロードを使用して)のPostgresにデータを格納し、私はMongoDBのにJavers ENTITY_INSTANCE_WITH_NULL_ID 2つのデータベース

春ブーツjaversを格納します。1.4.0.RELEASE

小枝データJPA:1.4.0.RELEASE

Javers: org.javers.core.metamodel.type.EntityType:2.3.0

私は、オブジェクトが怠惰なオブジェクトである場合にはIDがNULLであることデバッグと見ました: 88 "オブジェクトcdoId = getIdProp erty()。get(インスタンス); "

+0

コードを投稿してください –

答えて

3

JaVersにオブジェクトをコミットすると、以前のバージョンがJaversRepositoryから読み込まれ、現在のバージョン(commit()メソッドに渡されたバージョン)と比較されます。 この場合、JaVersはGlobalIdというクエリを使用してTypeName +エンティティIDを使用して以前のバージョンを検出します。 そのため、EntitiesではIDをnullにできません。ヌルIDが(ドメインモデルに応じて)このクラスでは正常です

  1. 場合はJaVersでValueObjectとしてそれをマップする必要があります

    は二つの可能性があります。

  2. Hibernateを使用している場合、レイジーローディングプロキシによくある問題があります。特定のクエリの場合、Hibernateはあなたの実際のドメインオブジェクトを返すのではなく、本質的に空の(したがってヌルID)動的プロキシオブジェクトを返します。このテクニックはスマートに見えるかもしれませんが、Hibernateで初期化されるまでオブジェクトをゴミ箱にします。 JaVersはHibernateUnproxyObjectAccessHookを提供しています。ドメインオブジェクトの初期化と非プロキシ処理が行われます。

    JaversBuilder.javers()。withObjectAccessHook( 新しいHibernateUnproxyObjectAccessHook())。(ビルド)

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

+0

これは機能します。どうもありがとうございます! –

+0

@BartekWalacikああ、ちょうどあなたがJaversの創作者だと分かった:-) Great Job !!!非常に役立ちます。ありがとう – adhg

関連する問題