如何在Hibernate中打破无限的父 - 子循环

时间:2018-01-10 17:35:51

标签: hibernate infinite-loop bidirectional-relation

我有一个带有Pages的应用程序,每个应用程序都有子页面:

Page.java

public class Page{
  ...
  @Nullable
  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  private Page parentPage;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "parentPage")
  private List<Page> childPages;
  ...
}

我想在每个页面上显示一个链接 << Back to parent page ,并提供指向其所有子项的链接:

view-page.html

<div ng-if="currentPage.parentPage">
  <a href="#/view-page?pageId={{currentPage.parentPage.id}}">Back to {{currentPage.parentPage.title}}</a>
</div>
...
<div ng-repeat="row in currentPage.childPages">
  <a href="#!/view-page?pageId={{row.id}}">{{row.title}}</a>
</div>

这导致无限循环父 - 子 - 父 - ...

我试过@JsonIgnore,但后来我失去了我需要的信息(无论是父母还是孩子)。我还尝试使用@JsonManagedReference和具有@JsonBackReference的子页面列表来注释父级。然后我可以看到父母,但不是孩子。我的下一步是尝试编写自定义序列化程序。

所以我的问题是 - 有没有人知道如何才能获得parentPage属性并且仍然能够看到孩子而不会进入无限循环的孩子 - 父母 - 孩子 - 父母......?

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。在其中一个关系中,我可以使用@JsonIgnore。在其他情况下,我需要使用自定义序列化程序,我不会加载孩子。

答案 1 :(得分:0)

我有同样的问题。有一种方法可以为“ parentPage”和“ childPages”创建自定义吸气剂,从而避免无限循环。

使其起作用的唯一条件是,您只有2个关系级别,这意味着第一堆页面是母版页面,没有父页面,第二个页面是子页面,从第一层开始一堆。

当您需要访问子页面的父页面(this.parentPage)时,不需要其子页面。父页面的getter只是删除其子页面以避免无限循环。

当您需要访问任何子页面时,可以通过设置父页面来识别它-然后可以忽略其子页面并返回null。

ssldir =  /etc/puppetlabs/puppet/ssl