1

我試圖從遷移到SDN 4.2SDN 5OGM 3春數據的Neo4j 5 OGM 3和Spring引導2.0.0.M4

一切幾乎完美的作品,除了一種情況。

現在爲了節省我必須使用深度= 2,而不是深度= 1就像在SDN 4.2

這很難解釋有那麼我創建在GitHub的一個示範項目再現這個問題的實體 - https://github.com/Artgit/spring-boot-2.0.0.M4-sdn5-ogm3-saving-issue

重現步驟:

如果你想使用自己的Neo4j的情況下,請跳過步驟#1,並開始從第2步閱讀。爲了旋轉起來的Neo4j 3.2.5在泊塢容器(必須安裝泊塢)

  • 執行測試

    1. 運行mvn docker:start -Dfile.encoding=UTF-8com.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 !!!! 
    

    我與用戶3和ID得到Value後更新rdbmsHorScalingValuevalueDao.getById())我希望這個用戶爲rdbmsHorScalingValue.getUpdateUser()但不知什麼原因,這是不正確的。

    但是,如果我們改變以下方法:com.decisionwanted.domain.dao.decision.characteristic.value.history.HistoryValueDaoImpl.create(Value)節省深度從12 - 一切都開始正常工作。

    現在我不知道問題出在哪裏,也不知道我知道的唯一的東西 - 它在使用SDN 4.2節省深度= 1時工作正常。

    請告訴我問題在哪裏(爲什麼它不適用於SDN 5)以及如何解決問題。

  • 回答

    2

    的問題是與更新方法(com.decisionwanted.domain.dao.decision.characteristic.value.ValueDaoImpl#update

    您正在改變的關係(UPDATED_BY),這是不是在當前會話跟蹤(這勢必交易)。它會離開你舊的UPDATED_BY關係 - 最終得到2個關係 - 直接在Neo4j中檢查你的圖。對於這種情況的行爲是未定義的,OGM期望圖模型來加工對象模型。

    爲什麼它能夠節省深度2 - 保存會將Value實例和關係添加到會話中(深度爲1時只會爲Value實例,而不是關係),並且後續更改爲然後檢測

    你應該在更新方法開始加載值實例(取決於你修改的深度):

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

    如果使用從@Transactional服務ValueDao對象,你不需要說,但* IT測試本身應該是事務性的以反映這一點。