弹簧数据Neo4j 5 OGM 3和弹簧护套2.0.0.M4

弹簧数据Neo4j 5 OGM 3和弹簧护套2.0.0.M4,neo4j,spring-data-neo4j,spring-data-neo4j-4,neo4j-ogm,spring-data-neo4j-5,Neo4j,Spring Data Neo4j,Spring Data Neo4j 4,Neo4j Ogm,Spring Data Neo4j 5,我正在尝试从sdn4.2迁移到sdn5和ogm3 除了一个案例外,所有的事情几乎都很完美 现在为了保存实体,我必须使用depth=2,而不是像SDN4.2那样使用depth=1 这很难解释,所以我在GitHub创建了一个演示项目,重现了这个问题- 复制步骤: 如果您想使用自己的Neo4j实例,请跳过步骤1并从步骤2开始阅读 运行mvn docker:start-Dfile.encoding=UTF-8,以便在docker容器中启动Neo4j 3.2.5(必须安装docker) 执行testcom

我正在尝试从
sdn4.2
迁移到
sdn5
ogm3

除了一个案例外,所有的事情几乎都很完美

现在为了保存实体,我必须使用depth=2,而不是像SDN4.2那样使用depth=1

这很难解释,所以我在GitHub创建了一个演示项目,重现了这个问题-

复制步骤:

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

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

  • 执行test
    com.decisionwanted.domain.decisionCharacteristict.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 
    
    我已经用user3更新了
    rdbmsHorScalingValue
    ,在通过id(
    valueDao.getById())获取
    Value
    后,我希望这个用户是
    rdbmsHorScalingValue.getUpdateUser()
    ,但由于未知原因,它不是真的

    但是如果我们改变以下方法:
    com.decisionwant.domain.dao.decision.characteristic.value.history.HistoryValueDaoImpl.create(value)
    将深度从
    1
    保存到
    2
    -一切都开始正常工作

    现在我不知道问题出在哪里,而且我知道的唯一一件事是,SDN4.2的保存深度=1可以正常工作


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

    问题在于您的更新方法(
    com.decisionwant.domain.dao.decision.characteristic.value.ValueDaoImpl\update

    您正在更改当前会话(绑定到事务)中未跟踪的关系(由更新)。它将保留旧的按关系更新的_-您最终有2个关系-直接在Neo4j中检查您的图形。这种情况下的行为是未定义的,OGM期望图形模型处理对象模型

    为什么它与保存深度2一起工作-保存会将值实例和与用户的关系添加到会话中(对于深度1,它将仅对值实例而不是关系执行此操作),然后检测后续更改

    应在更新方法的开头加载值实例(直到修改的深度):

    如果您使用来自
    @Transactional
    服务的ValueDao对象,您不需要这些,但是*IT测试本身应该是事务性的,以反映这一点

    rdbmsHorScalingValue = valueDao.update(rdbmsHorScalingValue, newStringValue2, newStringDescription2, user3,
                    null);
    
    assertEquals(user3, rdbmsHorScalingValue.getUpdateUser());
    
    rdbmsHorScalingValue = valueDao.getById(rdbmsHorScalingValue.getId());
    
    assertEquals(user3, rdbmsHorScalingValue.getUpdateUser()); // Error here !!!!
    
    value = valueRepository.getById(value.getId());