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
时,我们有一些规则吗
- 当依赖框架存在风险时,我们有什么建议吗
- 是否将
与stackoverflowerrror
总是与框架中的bug有关(我的意思是如果我在两个表中有3行)李>FetchType一起使用。EAGER
避免使用
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!但问题是关于堆栈溢出错误。你甚至都没有提到。在这里引用了你的答案: