2016-07-27 151 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 
    } 
} 
} 

但在儿童模特提交父母我有递归循环。 如何防止它?

是的,我也用@JsonIgnore。但我不确定这是否是好的做法。 但是,如果我有一个案件,当我需要一个类别,我真的需要发送它与UI的UI。 @JsonIgnore可以产生这个吗?

+0

关于获取实际对象的方法,您可以在参数中使用一个布尔值,例如名为'referenced'的参数,然后在对象调用其自身时将其设置为true。然后在构建过程中,检查'if(!referenced){...'这样你就可以避免递归循环,只获取一次引用。 – ghoulfolk

回答

0

@damienMiheev我也从同样的问题之苦,但调试问题1或半小时,我想通了,

,即使你的父字段加载懒洋洋地,而你的字段的自动生成JSON吸气获取调用它正在提取值,这是创建一些循环执行。 因为它是获取父对象,然后获取子对象并再次为子对象集合中的每个子对象获取父对象,并继续此过程直到StackOverflows。

这里是你的问题

您应该排除“父”的从JSON代例如解决方案您可以将该字段标记为@JsonIgnore。 你也不应该在你的hashCode(),equals()和toString()方法中包含父项和子项。