1

거의 한 경우를 제외하고 완벽하게 작동 3, 봄 부팅합니다.봄 데이터 Neo4j 5 OGM 내가 <code>SDN 4.2</code>에서 <code>SDN 5</code> 및 <code>OGM 3</code></p> <p>모든 마이그레이션하기 위해 노력하고있어 2.0.0.M4

지금 내가이 문제를 재현 GitHub의에서 데모 프로젝트를 만든 그래서이 설명하기 어려운

SDN 4.2에서와 같이 깊이 = 2 대신에 깊이 = 1을 사용해야하는 개체를 저장하기 위해 - https://github.com/Artgit/spring-boot-2.0.0.M4-sdn5-ogm3-saving-issue

단계 재현하기 :

당신이 1 단계를 생략하고 단계 2에서 읽기 시작하십시오 당신의 자신의 Neo4j 인스턴스를 사용하려면

.

  1. 실행 mvn docker:start -Dfile.encoding=UTF-8 도커 컨테이너에 Neo4j 3.2.5 (부두 노동자가 설치되어 있어야합니다)

  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 코드 : 나는 USER3로하고 ID로 Value을받은 후 rdbmsHorScalingValue를 업데이트 한

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

assertEquals(user3, rdbmsHorScalingValue.getUpdateUser()); 

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

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

(valueDao.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 인스턴스에만 해당). 당신이 @Transactional 서비스에서 ValueDao 객체를 사용하는 경우

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

것은 당신이 것을 필요로하지 않습니다 다음

당신은 (수정 깊이까지) 업데이트 방법의 시작 부분에 값 인스턴스를로드해야합니다 발견 그러나 IT 테스트는 그 자체로이를 반영하는 트랜잭션이어야합니다.