2016-07-27 2 views
2

У меня есть модель Категория. Он может иметь родительскую категорию и список подкатегорий. Я написал эти вопросы, потому что не мог найти случай, когда сущность относится к самому себе.Почему 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 это сделать?

+0

О методе, в котором вы получаете фактический объект, вы могли бы иметь логическое значение, например, называемое 'referenced' в параметрах, которое затем устанавливается равным true после того, как объект вызывает свое я. Затем во время построения сделайте проверку 'if (! Referenced) {...' Таким образом, вы можете избежать рекурсивного цикла и только получить ссылки один раз. – ghoulfolk

ответ

0

@damienMiheev Я также страдал от той же проблемы, но отладки вопрос 1 или полчаса я понял,

что даже если ваш родитель поле загружается лениво, в то время как автоматическая генерация JSON добытчик вашего поля вызывался который извлекает значения, которые создают некоторое циклическое выполнение. Потому что это выборка родителя, а затем выборка детей и снова выборка родительского для каждого дочернего элемента в коллекции детей и продолжение этого процесса до StackOverflows.

Вот решение вашей проблемы

Вы должны исключить «родителя» От JSon поколения, например, вы можете отметить это поле как @JsonIgnore. , вы также не должны включать родительские и дочерние элементы в методы hashCode(), equals() и toString().

Смежные вопросы