【问题标题】:Make Lazy initialization objects as null, while object is with hibernate proxy in jpa将延迟初始化对象设为空,而对象在 jpa 中使用休眠代理
【发布时间】: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。 没有什么能帮助我。 我只是想在延迟加载中将 BooksinsertedBy 列设为 null

现在我使用 Dto 类来避免 insertBy / 将 insertBy 设为 null。

有没有其他简单的方法不用转成Dto。

我多次遇到这个问题。一直以来,我都以转换为 Dto 告终。

如果有人知道答案,请帮我解决。

【问题讨论】:

  • 您的User 类是否有List&lt;Book&gt; 字段,该字段与Hibernate 正确映射?
  • 当你将一个对象转换为 JSON 时,所有字段的 getter 都会被调用。当insertedBy 的getter 将被调用(当休眠会话关闭时)它会抛出延迟加载异常。如果您想忽略此字段以转换为 JSON,您只需使用 @JsonIgnore 注释此字段,现在它不会转换为 JSON。
  • DTO 是在这种情况下要走的路。将域模型暴露给前端/API/集成层通常是个坏主意。拥有 DTO 可以明确区分,并允许两者独立发展。
  • Mushif Ali Nawaz,在图书列表页面中,我需要显示 insertBy 列。如果我将该字段设为 jsonIgnore 他们我可能无法使用该列
  • Augusto,这就是我现在遵循的,如果我有很多这样的场景,那么必须为每个模块编写转换代码。如果我使用像 Dozer mapper 这样的类转换机制,这些功能需要大量时间来转换记录列表。这使应用程序变慢

标签: java hibernate jpa


【解决方案1】:

Hibernate 中的“lazy-load”意味着子级在加载父级时实际上并没有被加载,通常是当您在迭代期间尝试访问子级时,它会被加载。在您的情况下,您会收到此延迟加载异常,因为当 gson 尝试访问子项以将其映射到 JSON 对象时,会话已经关闭。

您可以使用 Gson 提供的 ExclusionStrategy 类在映射到 JSON 时要求 GSON 忽略该字段。

【讨论】:

猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多