JPA:何时在StackOverflowError中急切地获取结果?

时间:2016-08-18 09:41:44

标签: java hibernate jpa orm stack-overflow

  1. 当我们应该弃用FetchType.EAGER时,我们是否有一套规则?

  2. 我听说过一些JPA框架(例如Hibernate)应该解决循环依赖。

    • 如果在框架上传递风险,我们是否有一些建议?
    • StackOverflowErrorFetchType.EAGER一起总是关于框架中的错误(我的意思是如果我在两个表中有3行)?

2 个答案:

答案 0 :(得分:1)

避免FetchType.EAGER的一个很好的理由是,您始终可以在JPQL(使用JOIN FETCH)中手动启用急切提取,但如果您已设置,则无法启用延迟提取FetchType.EAGER

答案 1 :(得分:1)

EAGER:

  • 方便,但速度慢

  • 当您的父类始终需要关联类时,请使用Eager。

懒惰:

  • 更多编码,但效率更高

  • 基本上延迟加载比急切的替代方案(性能,资源的使用)有更多的好处。除非遇到某些问题,否则通常不应将其配置为急切提取。

    • 在不同的hibernate会话中共享域实例(例如,将域类实例放入http会话范围并从中访问属性时 - 例如用户)

    • 如果您确定,在获取实例时,您将每次(或大部分时间)访问某个关系属性,配置此关系以进行预先获取也是有意义的。

例如:关系人和地址         在这里,没有必要当我加载Person实体时我需要一直提取地址,这样你就可以保持懒惰。

<强>结论

EAGER提取策略是代码气味。大多数情况下,它是为了简单起见而使用而不考虑长期性能损失。提取策略永远不应该是实体映射责任。每个业务用例都有不同的实体负载需求,因此应该将获取策略委托给每个单独的查询。 全局提取计划应该只定义LAZY关联,这些关联是基于每个查询获取的。结合始终检查生成的查询策略,基于查询的获取计划可以提高应用程序性能并降低维护成本。