让我们说我在伪代码中使用了一些实体:Article { id, author, text, date }
所有属性都是懒惰地初始化的。我有存储库方法:
@Transactional
Article loadArticle(int id) {
return articeRepository.find(id);
}
由不同的控制器使用。 PreviewController
需要author
和date
。 ViewController
需要text
和date
。
我应该将布尔参数initAuthor, initText, initDate
传递给loadArticle()
方法,以便为每个属性调用Hibernate.initialize()
吗?或者我应该将@Transactional
移动到控制器'方法?处理延迟初始化的最佳实践是什么?
答案 0 :(得分:2)
如果您的目标是拥有高性能的数据访问层,那么您应该记住一件事:每个用例都不同,因此需要不同类型的数据。
我想要建议的是,您希望针对不同的用例使用不同的方法,这些方法仅获取所需的数据。
有多种方法可以做到这一点:
我更喜欢后者,因为它清楚地表明它是显示数据而不是修改数据。
对于投影,Spring Data JPA可以提供帮助,因为它有一个开箱即用的解决方案,它基本上定义了一个界面。
如果使用Hibernate.initialize()
或任何其他方式触发加载实体关系,实际上您将触发数据库查询。如果您考虑让我们说100个实体,那意味着您将执行101个查询。使用抓取或只读投影。