Самосоединение Spring data JPA к объекту. Как мне указать глубину рекурсии?

#spring-boot #spring-data-jpa

#spring-boot #весна-данные-jpa #spring-data-jpa

Вопрос:

Используя Spring Boot JPA, я выполняю самосоединение в таблице «Person» с атрибутами id, name и parent_id. parent_id — это ссылка на внешний ключ Person.id. Итак, у человека будет ноль или один родитель. Пример моего класса домена приведен ниже.

 @Entity(name="person")
public class Person {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;

    @Column(name="name")
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="parent_person_id")
    private Person parent;

    // constructors, getters, setters, etc
}

  

На самом деле это работает просто отлично; например, когда я запрашиваю с помощью CrudRepository.findById(), я получаю объект Person со встроенным объектом Person (родительский), у которого может быть другой встроенный объект Person (grandparent) и т.д., Пока я не доберусь до Person без родительского.

Мой вопрос в том, как я могу получить только Person и их непосредственного родителя без дальнейшего рекурсии (без бабушек и дедушек, прабабушек и дедушек и т.д.)?

Я полагаю, что мог бы просто избежать объединения и сделать parent_id простым столбцом @, затем на уровне сервиса выполнить дополнительный запрос для поиска родительского элемента, но мне интересно, есть ли какая-нибудь магия Jpa, которая могла бы упростить задачу.

Комментарии:

1. Вы имеете в виду, что у вас есть бесконечный цикл в результате JSON?

2. Нет, это работает просто отлично — но я хотел бы выполнить рекурсию только на один уровень глубже. Только родитель, и ничего больше.

3. Я понимаю, но как вы возвращаете объект? Это rest api? Или у вас просто проблема с toString() in System.out.println() .

4. Вы пробовали добавлять referencedColumnName в столбец join?

5. Что произошло на самом деле, когда вы вызываете parent ? поле @JsonIgnoreProperties({ "parent" }) on parent должно работать, если вы столкнулись с проблемой при сериализации

Ответ №1:

На самом деле, это было не так сложно, как казалось. Преобразование моей сущности Person в dto предоставило мне возможность просто остановиться на родительском элементе, а не выполнять рекурсию по всему дереву!