最近,我创建了一个项目,在我的模型中,我有ManyToMany后面的引用。
我的模型如下:
@Entity
public class A {
@ManyToMany(mappedBy = "parents", fetch = FetchType.EAGER)
private Set<A> children = new HashSet<>();
@ManyToMany
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@JoinTable(
name = "link_a_recursion",
joinColumns = @JoinColumn(name = "child_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "id")
)
private Set<A> parents = new HashSet<>();
//I removed the rest ( setter, getter and other fields )
}
当我获取此模型并想要加载子模型时,它将引发StackOverFlowException错误(递归异常)
我想知道有什么方法可以说休眠只是加载一个级别的关联,而不必深入。
为了澄清:
A.children[0].children[0].children should be null to stop recursion
我要加载第一个孩子,而不是其他孩子里面的所有孩子
编辑:
我添加另一个实体:
@Entity
public class B {
@OneToMany(mappedBy = "b")
private Set<A> entities = new HashSet<>();
//setter, getter
}
并将以下内容添加到A实体:
@ManyToOne
private B b;
然后我在下面进行了更改:
@ManyToMany(mappedBy = "parents", fetch = FetchType.EAGER)
至
@ManyToMany(mappedBy = "parents", fetch = FetchType.LAZY)
在我的BService中,我的findOne函数如下所示:
@Transactional(readOnly = true)
public B findOne(Long id) {
B b = repository.findOne(id);
for (A a: b.getEntities()) {
a.getChildren().size();
}
return b;
}
但是我又得到了错误:(
最佳答案
尝试延迟获取
@ManyToMany(mappedBy = "parents", fetch = FetchType.LAZY)