我们可以更新一个RelationshipEntity指向另一个NodeEntity吗?

问题描述 投票:0回答:1

[使用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);
}

[最后,loadedActorloadedActor2不反映更新的关系。

neo4j-ogm
1个回答
1
投票

您可以通过将属性保留在Role实例中来实现此目的。但是,当您尝试更新时,必须重置ID。关系是什么都不能重用,但是必须重新创建。

Neo4j-OGM以给定的ID假定仅属性已更改,而起始或结束节点未更改。

关于测试用例的一些说明:

  • 如果在第一次保存后调用session.clear(),则必须在操作模型之前重新加载actor,以使Neo4j-OGM知道更改。
  • 仅保存actor就足够了。保存级联到所有可访问的节点和关系。即使在删除的情况下,如果您尊重第一个备注,这也应该有效;)
© www.soinside.com 2019 - 2024. All rights reserved.