当我们应该弃用FetchType.EAGER
时,我们是否有一套规则?
我听说过一些JPA框架(例如Hibernate)应该解决循环依赖。
StackOverflowError
和FetchType.EAGER
一起总是关于框架中的错误(我的意思是如果我在两个表中有3行)? 答案 0 :(得分:1)
避免FetchType.EAGER
的一个很好的理由是,您始终可以在JPQL
(使用JOIN FETCH
)中手动启用急切提取,但如果您已设置,则无法启用延迟提取FetchType.EAGER
。
答案 1 :(得分:1)
EAGER:
方便,但速度慢
当您的父类始终需要关联类时,请使用Eager。
懒惰:
更多编码,但效率更高
基本上延迟加载比急切的替代方案(性能,资源的使用)有更多的好处。除非遇到某些问题,否则通常不应将其配置为急切提取。
在不同的hibernate会话中共享域实例(例如,将域类实例放入http会话范围并从中访问属性时 - 例如用户)
如果您确定,在获取实例时,您将每次(或大部分时间)访问某个关系属性,配置此关系以进行预先获取也是有意义的。
例如:关系人和地址 在这里,没有必要当我加载Person实体时我需要一直提取地址,这样你就可以保持懒惰。
<强>结论强>
EAGER提取策略是代码气味。大多数情况下,它是为了简单起见而使用而不考虑长期性能损失。提取策略永远不应该是实体映射责任。每个业务用例都有不同的实体负载需求,因此应该将获取策略委托给每个单独的查询。 全局提取计划应该只定义LAZY关联,这些关联是基于每个查询获取的。结合始终检查生成的查询策略,基于查询的获取计划可以提高应用程序性能并降低维护成本。