我用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
?
感谢。
答案 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应用程序所使用的对象的更多控制。