最近,我创建了一个项目,在我的模型中,我有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)

10-07 20:37