#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()
inSystem.out.println()
.4. Вы пробовали добавлять
referencedColumnName
в столбец join?5. Что произошло на самом деле, когда вы вызываете parent ? поле
@JsonIgnoreProperties({ "parent" })
onparent
должно работать, если вы столкнулись с проблемой при сериализации
Ответ №1:
На самом деле, это было не так сложно, как казалось. Преобразование моей сущности Person в dto предоставило мне возможность просто остановиться на родительском элементе, а не выполнять рекурсию по всему дереву!