弹簧数据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开始阅读
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());