【问题标题】:Best practice for Hibernate lazy properties initialization in MVC?MVC 中 Hibernate 延迟属性初始化的最佳实践?
【发布时间】:2017-03-07 12:31:27
【问题描述】:

假设我在伪代码中使用了一些实体:Article { id, author, text, date },所有属性都是延迟初始化的。我有存储库方法:

@Transactional
Article loadArticle(int id) {
  return articeRepository.find(id);
}

由不同的控制器使用。 PreviewController 需要 authordateViewController 需要 textdate。 我应该将布尔参数initAuthor, initText, initDate 传递给loadArticle() 方法来为那里的每个属性调用Hibernate.initialize() 吗?或者我应该将@Transactional 移动到控制器的方法中吗?处理延迟初始化的最佳做法是什么?

【问题讨论】:

    标签: java spring hibernate model-view-controller


    【解决方案1】:

    如果您的目标是拥有一个高性能的数据访问层,那么您应该牢记一件事:每个用例都不同,因此需要不同类型的数据。

    我想对此提出的建议是,您希望为不同的用例提供不同的方法,只获取所需的数据。

    有多种方法可以做到这一点:

    1. 使用 fetch join 获取实体关系
    2. 创建只读投影

    我更喜欢后者,因为它清楚地表明它是用于显示数据而不是修改数据。

    对于投影,Spring Data JPA 可以提供帮助,因为它有一个开箱即用的解决方案,基本上是定义一个接口。

    如果您使用Hibernate.initialize() 或任何其他方式触发加载实体关系,实际上您将触发数据库查询。如果您考虑假设 100 个实体,这意味着您将执行 101 个查询。使用获取或只读投影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2014-08-19
      • 1970-01-01
      • 2020-03-28
      相关资源
      最近更新 更多