在MVC中进行Hibernate延迟属性初始化的最佳实践?

时间:2017-03-07 12:31:28

标签: java spring hibernate model-view-controller

让我们说我在伪代码中使用了一些实体:Article { id, author, text, date }所有属性都是懒惰地初始化的。我有存储库方法:

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

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

1 个答案:

答案 0 :(得分:2)

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

我想要建议的是,您希望针对不同的用例使用不同的方法,这些方法仅获取所需的数据。

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

  1. 使用提取连接获取实体关系
  2. 创建只读投影
  3. 我更喜欢后者,因为它清楚地表明它是显示数据而不是修改数据。

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

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