我正在使用Neo4j-OGM更新a @RelationshipEntity
指向另一个节点对象。但是,当我尝试保留更改时,不会保存更改,而只是恢复为原始实体。
例如,这就是我要实现的目标:
from: (X)--[R]->(M) (Y)
to: (Y)--[R]->(M) (X)
我在CineastsRelationshipEntityTest
集成测试中做了一个例子:
@Test
public void canUpdateRelationshipEntity() {
Movie movie = new Movie("M", 2020);
Actor actor = new Actor("X");
Role relationship = actor.playedIn(movie, "R");
Actor actor2 = new Actor("Y");
actor2.setRoles(new HashSet<>());
assertThat(actor.getRoles()).hasSize(1);
assertThat(actor2.getRoles()).hasSize(0);
session.save(actor);
session.save(actor2);
session.clear();
// try to update the relationship:
relationship.setActor(actor2);
actor.getRoles().remove(relationship);
actor2.getRoles().add(relationship);
assertThat(actor.getRoles()).hasSize(0);
assertThat(actor2.getRoles()).hasSize(1);
session.save(actor);
session.save(actor2);
session.clear();
Actor loadedActor = session.load(Actor.class, actor.getUuid());
Actor loadedActor2 = session.load(Actor.class, actor2.getUuid());
assertThat(loadedActor.getRoles()).hasSize(0);
assertThat(loadedActor2.getRoles()).hasSize(1);
}
最后,loadedActor
并loadedActor2
没有反映更新的关系。
您可以着重于将属性保留在Role
实例中。但是,当您尝试更新时,必须重置ID。关系是没有什么可以重用的,但必须重新创建。
Neo4j-OGM以给定的ID假设仅属性已更改,而起始或结束节点未更改。
关于测试用例的一些说明:
session.clear()
(在第一次保存之后),则必须在处理模型之前重新加载actor,以使Neo4j-OGM知道更改。actor
。保存级联到所有可访问的节点和关系。即使在删除的情况下,如果您尊重第一个备注,这也应该有效;)
谢谢您的发言,我已经弄清楚了。我进行了示例单元测试来演示此技术以及其他技术:github.com/cmosher01/neo4j-ogm-demo