如何看待JHipster生成的一对多关系中的双方

时间:2018-03-02 15:45:02

标签: json one-to-many jhipster

我用JHipster生成了一个简单的应用程序。我有几个关系中的实体。例如,我有IndexPage,其中包含多个IndexAreas。每个IndexArea可以包含多个IndexTiles。每个IndexTile都与一个CoursePage相关联。

默认情况下,@JsonIgnore侧有@OneToMany注释,但这意味着我无法显示前端的所有元素(因为我不会看到它们)。例如,我可以修改IndexTile并从下拉列表中选择IndexArea,但我无法ng-repeat通过IndexTiles IndexArea因为它们不在JSON中。

如果我删除@JsonIgnore,我会得到无限递归(这是预期的)。所以我用@JsonIgnore替换了所有@JsonSerialize(using = MyCustomSerializer.class) s。这是我目前的状态:

public class IndexPage {
...
  @OneToMany(mappedBy = "indexPage")
  @JsonSerialize(using = IndexAreaSerializer.class)
  private Set<IndexArea> indexAreas = new HashSet<>();
...
}

public class IndexArea {
...
  @ManyToOne
  private IndexPage indexPage;

  @OneToMany(mappedBy = "indexArea")
  @JsonSerialize(using = IndexTileSerializer.class)
  private Set<IndexTile> indexTiles = new HashSet<>();
...
}

public class IndexTile{
  ...
  @ManyToOne
  private IndexArea indexArea;

  @OneToOne
  @JoinColumn(unique = true)
  private CoursePage coursePage;
  ...
}

public class CoursePage {
  ...
  @OneToOne(mappedBy = "coursePage")
  @JsonIgnore // a CoursePage doesn't care about the indexTile
  private IndexTile indexTile;
  ...
}

现在,当我刷新页面时,出现错误:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: rs.kursnemackog.domain.IndexPage.indexAreas, could not initia
lize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: rs.kursnemackog.domain.IndexPage.indexAreas, could no
t initialize proxy - no Session (through reference chain: rs.kursnemackog.domain.IndexPage["indexAreas"])

我能做些什么才能看到关系的两面并正常使用它们(例如,能够为IndexArea和{{1}选择IndexTile通过某个ng-repeat中的所有IndexTiles

感谢。

1 个答案:

答案 0 :(得分:0)

延迟加载异常是正常的,因为JHipster将所有关系声明为延迟加载,这被认为是一种很好的做法。该异常是由于缺少会话,因为它是在JSON序列化时完成的,因此在服务或存储库层中关闭了事务之后。

有几种解决方案,例如使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container" id="container"> <img id="par1" src="https://www.gettyimages.ca/gi-resources/images/Homepage/Hero/UK/CMS_Creative_164657191_Kingfisher.jpg" alt=""> <h1>TEXT</h1> </div>@Transactional属性扩展交易范围,但通常最好使用open-session-in-view修改您的存储库以急切获取您的关系或者用查询语言。

此处有更多提示:How does the FetchMode work in Spring Data JPA

此外,您可能希望在JHipster中使用DTO和Service类选项,以避免在REST API中公开您的实体,并获得对Angular应用程序所使用的对象的更多控制。