Можем ли мы обновить RelationshipEntity, чтобы он указывал на другой NodeEntity? - PullRequest
0 голосов
/ 25 января 2020

Использование 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 не отражают обновленные отношения.

1 Ответ

1 голос
/ 31 января 2020

Вы можете сделать это с акцентом на сохранение свойств в экземпляре Role. Но вы должны сбросить идентификатор при попытке обновления. Отношения - это ничто, что вы можете использовать повторно, но должны быть созданы заново.

Neo4j-OGM предполагает с заданным идентификатором, что изменились только свойства, а не начальный или конечный узел.

Некоторые замечания по вашему тесту case:

  • если вы звоните session.clear() (после первого сохранения), вам необходимо перезагрузить акторов, прежде чем манипулировать вашей моделью, чтобы Neo4j-OGM знал об изменениях.
  • Этого было бы достаточно, чтобы сохранить только actor. Каскады сохранения ко всем достижимым узлам и отношениям. Даже в случае удаления это должно работать, если вы уважаете первое замечание;)
...