Java JPA:什么时候急取会导致StackOverflower错误?

Java JPA:什么时候急取会导致StackOverflower错误?,java,hibernate,jpa,orm,stack-overflow,Java,Hibernate,Jpa,Orm,Stack Overflow,当我们应该放弃使用FetchType.EAGER时,我们有一些规则吗 我听说一些JPA框架(例如Hibernate)应该解决循环依赖关系 当依赖框架存在风险时,我们有什么建议吗 是否将stackoverflowerrror与FetchType一起使用。EAGER总是与框架中的bug有关(我的意思是如果我在两个表中有3行) 避免使用FetchType.EAGER的一个很好的理由是,您始终可以在JPQL中手动启用EAGER FETCH(使用JOIN FETCH),但是,如果设置了FetchTyp

当我们应该放弃使用
FetchType.EAGER
时,我们有一些规则吗

  • 我听说一些JPA框架(例如Hibernate)应该解决循环依赖关系

    • 当依赖框架存在风险时,我们有什么建议吗
    • 是否将
      stackoverflowerrror
      FetchType一起使用。EAGER
      总是与框架中的bug有关(我的意思是如果我在两个表中有3行)

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

    避免
    FetchType的一个很好的理由是,EAGER
    可以始终在
    JPQL
    中手动启用急切抓取(使用
    加入抓取
    ),但是如果设置了
    FetchType.EAGER

    EAGER:

    • 方便,但慢

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

    懒惰:

    • 更多的编码,但效率更高

    • 基本上,延迟加载比渴望加载有更多的好处(性能、资源使用)。除非遇到某些问题,否则通常不应将其配置为即时抓取

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

      • 如果确定每次(或大部分时间)获取实例时都会访问某个关系属性,那么将此关系配置为即时获取也是有意义的

    关系人和地址 在这里,当我加载Person实体时,不需要一直获取地址,这样您就可以保持懒惰

    结论

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

    EAGER:

    • 方便,但慢

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

    懒惰:

    • 更多的编码,但效率更高

    • 基本上,延迟加载比渴望加载有更多的好处(性能、资源使用)。除非遇到某些问题,否则通常不应将其配置为即时抓取

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

      • 如果确定每次(或大部分时间)获取实例时都会访问某个关系属性,那么将此关系配置为即时获取也是有意义的

    关系人和地址 在这里,当我加载Person实体时,不需要一直获取地址,这样您就可以保持懒惰

    结论

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

    所有JPA提供商都应该能够处理循环关系的紧急加载。任何问题都应该意味着你对JPA提供商提出了一个错误。@NeilStockton,谢谢!我在这里引用了您的答案:所有JPA提供者都应该能够处理循环关系的急切加载。任何问题都应该意味着你对JPA提供商提出了一个错误。@NeilStockton,谢谢!我在这里引用了你的答案:谢谢你的回答,upvoited!但问题是关于
    堆栈溢出错误
    。你甚至没有提到它。在这里引用了你的答案:谢谢你的回答,upvoited!但问题是关于
    堆栈溢出错误
    。你甚至都没有提到。在这里引用了你的答案: