1

私はSDN 5SDN 4.2から移行しようとしているとOGM 3春データのNeo4j 5 OGM 3と春ブーツ2.0.0.M4

すべてがほぼ1の場合を除いて完璧に動作します。

今私は、私はこの問題を再現するのGitHubでのデモプロジェクトを作成しているので、それが説明するのは難しい

SDN 4.2でのように深さ= 2の代わりに、深さ= 1を使用する必要が実体を節約するために - 再現するhttps://github.com/Artgit/spring-boot-2.0.0.M4-sdn5-ogm3-saving-issue

ステップ:

あなたがあなた自身のNeo4jのインスタンスを使用する場合は、ステップ#1をスキップしてステップ#2から読み始めてください。

  1. ドッカーコンテナでのNeo4j 3.2.5をスピンアップするために、ファイル名を指定して実行mvn docker:start -Dfile.encoding=UTF-8(ドッカーをインストールする必要があります)

  2. はテストアサーションで失敗するテストcom.decisionwanted.domain.DecisionCharacteristicIT.testUpdateValue()

を実行します。

java.lang.AssertionError: expected:<BaseEntity [id=3, class=class com.decisionwanted.domain.model.user.User, createDate=Wed Oct 04 21:54:17 EEST 2017, updateDate=Wed Oct 04 21:54:17 EEST 2017]> but was:<BaseEntity [id=2, class=class com.decisionwanted.domain.model.user.User, createDate=Wed 

次のようにNGコード:

rdbmsHorScalingValue = valueDao.update(rdbmsHorScalingValue, newStringValue2, newStringDescription2, user3, 
       null); 

assertEquals(user3, rdbmsHorScalingValue.getUpdateUser()); 

rdbmsHorScalingValue = valueDao.getById(rdbmsHorScalingValue.getId()); 

assertEquals(user3, rdbmsHorScalingValue.getUpdateUser()); // Error here !!!! 

私がUSER3でrdbmsHorScalingValueを更新したとidによってValuevalueDao.getById())を取得した後、私はrdbmsHorScalingValue.getUpdateUser()としてこのユーザーを期待するが、いくつかの未知の理由で、それは真実ではありません。

ただし、次の方法で変更した場合:com.decisionwanted.domain.dao.decision.characteristic.value.history.HistoryValueDaoImpl.create(Value)1から2までの保存深度 - すべてが正常に機能し始めます。

今は私が知っている唯一の問題はどこにあるのかわかりません。SDN 4.2で深度= 1を保存しても問題ありません。

問題がどこにあるのか(なぜそれがSDN 5で動作しないのか)と解決方法を教えてください。あなたが方法(com.decisionwanted.domain.dao.decision.characteristic.value.ValueDaoImpl#update

あなたは(トランザクションにバインドされている)、現在のセッションで追跡されていない関係(UPDATED_BY)を、変更されているを更新して

答えて

2

問題があります。それはあなたの古いUPDATED_BY関係を残します - あなたは2つの関係で終わります - Neo4jのグラフを直接チェックしてください。そのような場合の動作は定義されていません.OGMでは、グラフモデルがオブジェクトモデルを操作することが期待されています。

深さ2を保存する理由 - 保存すると、Valueインスタンスとその関係がセッションに追加されます(深さ1の場合、関係ではなくValueインスタンスでのみ行われます)。その後、

を検出します(変更の深さまで)更新方法の開始時の値のインスタンスをロードする必要があります。

value = valueRepository.getById(value.getId()); 

あなたは@TransactionalサービスからValueDaoオブジェクトを使用する場合は、あなたがいることを必要としませんしかし、それを反映するためには* ITテスト自体がトランザクション的でなければなりません。

関連する問題