Spring Data Neo4j 5 OGM 3和Spring Boot 2.0.0.M4

时间:2017-10-04 19:07:00

标签: neo4j spring-data-neo4j spring-data-neo4j-4 neo4j-ogm spring-data-neo4j-5

我尝试从SDN 4.2迁移到SDN 5OGM 3

除了一个案例,一切都几乎完美无缺。

现在为了保存实体我必须使用深度= 2而不是深度= 1,就像在SDN 4.2

很难在那里解释所以我在GitHub上创建了一个演示项目来重现这个问题 - https://github.com/Artgit/spring-boot-2.0.0.M4-sdn5-ogm3-saving-issue

重现的步骤:

如果您想使用自己的Neo4j实例,请跳过步骤#1并开始阅读第2步。

  1. 运行mvn docker:start -Dfile.encoding=UTF-8以便在Docker容器中启动Neo4j 3.2.5(必须安装Docker)

  2. 执行测试com.decisionwanted.domain.DecisionCharacteristicIT.testUpdateValue()

  3. 测试应该以断言失败:

    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 
    

    从以下代码中可以看出:

    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,并且在获得Value ID后valueDao.getById())我希望此用户为rdbmsHorScalingValue.getUpdateUser(),但由于某些未知原因,情况并非如此。

    但是,如果我们使用以下方法进行更改:com.decisionwanted.domain.dao.decision.characteristic.value.history.HistoryValueDaoImpl.create(Value)将深度从1保存到2 - 一切都会正常运行。

    现在我不知道问题出在哪里,我知道的唯一一件事 - 它在SDN 4.2中保存深度= 1时工作正常。

    请告诉我问题出在哪里(为什么它不能与SDN 5一起使用)以及如何解决它。

1 个答案:

答案 0 :(得分: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测试本身应该是交易性的,以反映这一点。