У меня есть модель Категория. Он может иметь родительскую категорию и список подкатегорий. Я написал эти вопросы, потому что не мог найти случай, когда сущность относится к самому себе.Почему FetchType.Lazy не работает?
Я пытался реализовать это следующим образом:
@Entity
public class Category {
@Id
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Category> subcategories = Lists.newArrayList();
}
Я сохранить объекты, как:
Category parent = new Category();
parent.setName("parent");
Category child1 = new Category();
child1.setName("child1");
child1.setParent(parent);
parent.getSubcategories().add(child1);
categoryPersistence.save(parent);
Я ожидал увидеть что-то вроде:
parent {
id
parent: null
childs {
child {
id
parent: ...lazy loading exception...
childs: null
}
}
}
Но в детской модели на filed parent Я имею рекурсивный цикл. Как предотвратить это?
Да, я также использовал @JsonIgnore. Но я не был уверен, что это хорошая практика. Но если у меня есть случай, когда мне нужна одна категория, и я действительно должен отправить ее в пользовательский интерфейс с родителем. Может ли это @JsonIgnore это сделать?
О методе, в котором вы получаете фактический объект, вы могли бы иметь логическое значение, например, называемое 'referenced' в параметрах, которое затем устанавливается равным true после того, как объект вызывает свое я. Затем во время построения сделайте проверку 'if (! Referenced) {...' Таким образом, вы можете избежать рекурсивного цикла и только получить ссылки один раз. – ghoulfolk