Neo4j Spring ogm вызывает переполнение стека для концепции последователей - PullRequest
1 голос
/ 12 февраля 2020

Пытается реализовать простую концепцию социальной сети: подписчики + подписчики. Все это просто аккаунты, связанные друг с другом. Использование Neo4j и Spring boot.

'org.springframework.boot' version '2.2.4.RELEASE'
'org.springframework.boot:spring-boot-starter-data-neo4j'

Account.class

@NodeEntity
public class Account {

  @Id
  private String pk;

  @Relationship(type = "FOLLOWS", direction = Relationship.INCOMING)
  private Set<Account> followers;

  @Relationship(type = "FOLLOWS", direction = Relationship.OUTGOING)
  private Set<Account> followings;
}

Использование стандартных пружин CrudRepository (или Neo4JRepository, без разницы) я постоянно получить stackoverflows, работающие с аккаунтами. Простейшая ситуация, когда A следует B, а B следует A, вызывает SOF для findById(). Я понимаю, что у этого есть что-то. делать с глубиной выборки, но по умолчанию это 1, что означает, что я должен получить followers и followings счета, но их отношения должны быть пустыми. Отношения работают правильно с точки зрения добавления: я могу подключить учетные записи с любого конца, добавив к соответствующему Set, и график получается точно так, как я намереваюсь, но выборка не работает ..

Основной вопрос : Что я делаю и неправильно понимаю, и что можно сделать, чтобы правильно реализовать такого рода отношения?

Я пытался использовать session.load() с глубиной 0, и без SOF, конечно, но это это не совсем то, что мне нужно. Глубина по умолчанию 1 должна предоставить именно то, что мне нужно, но я полагаю, что я неправильно понимаю концепцию?

И дополнительно : есть ли способ настроить глубину по умолчанию для всего приложения? Без использования session вручную, таким образом, переопределяются все основные операции c.

1 Ответ

0 голосов
/ 13 февраля 2020

Наконец, понял. Реальная проблема была не в получении, а во внутреннем вызове equals() и hashcode() где-то во время выборки. Поскольку я использую lombok с @Data, все свойства, участвующие в этих методах, вызывают SOF.

Добавление @EqualsAndHashCode(exclude={"followers", "followings"}) к аннотациям класса устранило проблему, и теперь глубина = 1 работает.

...