[使用Neo4j-OGM,我正在尝试更新@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
就足够了。保存级联到所有可访问的节点和关系。即使在删除的情况下,如果您尊重第一个备注,这也应该有效;)