为什么FetchType.Lazy不起作用?

时间:2016-07-27 16:04:36

标签: java spring hibernate jpa

我有型号类别。它可能有父类别和子类别列表。我写了这个问题,因为找不到实体与自己有关的案例。

我试图像这样实现它:

@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。 @JsonIgnore可以制作这个吗?

1 个答案:

答案 0 :(得分:1)

@damienMiheev我也遇到了同样的问题,但调试问题1或半小时我想出来了

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

以下是您的问题的解决方案

你应该从json世代中排除“父”,例如你可以将该字段标记为@JsonIgnore。 你也不应该在hashCode(),equals()和toString()方法中包含父元素和子元素。