Neo4J: правильный способ удалить отношения? - PullRequest
0 голосов
/ 09 января 2019

Вот мои узлы:

@NodeEntity
public class User {

    @Id
    @Index(unique = true)
    @GeneratedValue(strategy = UuidStrategy.class)
    private String id;

    @Relationship(type = "LIKE")
    private Collection<Pattern> likedPatterns;
    ...
}


@NodeEntity
public class Pattern {
    @Id
    @Index(unique = true)
    @GeneratedValue(strategy = UuidStrategy.class)
    private String id;

    private String name;

    @Relationship(type = "LIKE", direction = Relationship.INCOMING)
    private List<User> likes;
    ...
}

Я пытаюсь удалить связь между пользователем и шаблоном:

@Override
@Transactional(readOnly = false)
public void deleteLikedPattern(String patternId, Long authId) {
    User user = userRepository.findByAuthId(authId);
    user.getLikedPatterns().removeIf(p -> p.getId().equals(patternId));
    userRepository.save(user);

}

В начале у пользователя есть 2 шаблона. При отладке я вижу, что patternId найден в коллекции шаблонов, а соответствующий шаблон удален из списка. Тогда сохранение () сделано, и я не получил ошибку. Но если я проверю в БД, шаблон и пользователь все еще связаны, связь все еще здесь.

Я попытался решить эту проблему Neo4j OGM, как удалить связь , которая работает. Это означает, что если я хочу удалить связь, я должен удалить связь в списке обеих сущностей:

  • удалить шаблон из коллекции пользовательских шаблонов
  • удалить пользователя из коллекции пользователя шаблона)

    что немного утомительно ...

И во многих других ветках, спрашивающих об одной и той же проблеме, люди, похоже, не предлагают удалять ассоциации с обеих сторон. У меня вопрос: нужно ли мне удалять ассоциации с обеих сторон, или это должно работать, просто удаляя шаблон из списка избранного пользователя?

Thx

1 Ответ

0 голосов
/ 15 января 2019

Прежде всего, нет необходимости полностью объяснять ваши отображения отношений в обоих классах, в которых нет необходимости. (Личное примечание: с архитектурной точки зрения я бы хотел избежать двунаправленных зависимостей между классами.)

Ответ в том, что вам нужно удалить его только на «переднем» конце. Это твой User. В тот момент, когда вы сохраняете user, связь будет удалена, потому что Neo4j-OGM a) видит модификацию и b) не может добраться до отрезанного узла, чтобы вернуться к user и воссоздать его в том же процессе.

Некоторые дополнительные примечания: даже не должно существовать хранилище для Pattern, если в приведенном выше примере User рассматривается как совокупный корень. Поэтому сохранение Pattern всегда требует сохранения связанного User. Как я вижу, это немного сложнее в вашей текущей модели предметной области, потому что вы используете отображение m: n (многие ко многим). Идея Spring Data заключается в том, чтобы дать вам возможность мыслить и работать в DDD (проектирование драйвера домена). Я предлагаю прочитать эту статью http://udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/ и / или другие статьи о многих многим с DDD.

...