【发布时间】:2019-09-26 05:42:50
【问题描述】:
例如我有如下三个类
User{
Integer id;
...
}
Book{
Integer id;
....
@ManyToOne(fetch=FetchType.lazy)
User insertedBy;
}
Author{
Integer id;
List<Book> books;
}
现在我需要在同一页面上显示 作者列表 和他们所写的书籍 所以我使用 jpa 存储库通过 findAll() 方法获取作者。在这里我不需要插入的 书的专栏,所以我用 延迟加载 让他们生气。
当我尝试使用 Gson 将这些作者列表转换为 json 对象时。 它在用户类中提供延迟加载异常(休眠代理......找不到会话......)
我遵循了这个网络中提供的许多方法,例如 TypeAdapters。 没有什么能帮助我。 我只是想在延迟加载中将 Books 的 insertedBy 列设为 null。
现在我使用 Dto 类来避免 insertBy / 将 insertBy 设为 null。
有没有其他简单的方法不用转成Dto。
我多次遇到这个问题。一直以来,我都以转换为 Dto 告终。
如果有人知道答案,请帮我解决。
【问题讨论】:
-
您的
User类是否有List<Book>字段,该字段与Hibernate 正确映射? -
当你将一个对象转换为 JSON 时,所有字段的 getter 都会被调用。当
insertedBy的getter 将被调用(当休眠会话关闭时)它会抛出延迟加载异常。如果您想忽略此字段以转换为 JSON,您只需使用@JsonIgnore注释此字段,现在它不会转换为 JSON。 -
DTO 是在这种情况下要走的路。将域模型暴露给前端/API/集成层通常是个坏主意。拥有 DTO 可以明确区分,并允许两者独立发展。
-
Mushif Ali Nawaz,在图书列表页面中,我需要显示 insertBy 列。如果我将该字段设为 jsonIgnore 他们我可能无法使用该列
-
Augusto,这就是我现在遵循的,如果我有很多这样的场景,那么必须为每个模块编写转换代码。如果我使用像 Dozer mapper 这样的类转换机制,这些功能需要大量时间来转换记录列表。这使应用程序变慢