JPA,我怎么能有两个查询,一个使用懒惰,一个使用渴望获取?

时间:2015-06-09 14:33:36

标签: java hibernate jpa

我有一些嵌套对象,Package-> Documents-> Pages。该包包含一组文档,该文档包含一组页面。我与Pages-> Documents and Documents->页面的关系都设置为EAGER,因为当我请求包时,我希望它能够获得所有文档以及所有页面。

现在我还有另一项要求,只能获取Package-> Documents,但我也不想检索Document-> Pages,因为这个查询需要更高效,并且不需要数据。

有没有办法使用相同的模型对象来关闭EAGER?或者有没有办法可以将它更改为LAZY然后强制它急切而不必遍历包中的每个文档并调用getPages()?

这是首选,最有效的方法吗?

2 个答案:

答案 0 :(得分:3)

这一切都在这里解释:Difference between JOIN and JOIN FETCH in Hibernate

将您的关系设置为延迟并使用join fetch编写查询以急切检索所有子项,同时通过简单连接保持常规查询以便懒惰地获取数据。

答案 1 :(得分:1)

正如其他地方所述,您需要将关系标记为LAZY,并在需要时将EAGER提取的交易标记为相反:一旦关系被标记为EAGER,无论您在查询中指定什么,它都会被急切地提取

一旦你将它标记为LAZY,你显然需要一种机制来在需要时启用EAGER抓取。

JPA 2.1引入了一个新功能 - 实体图 - 作为一种尝试和解决(以优雅的方式)在不同用例的实体图中获取不同深度的长期问题的手段。

您可以在此处阅读有关实体图的更多信息:

https://blogs.oracle.com/theaquarium/entry/jpa_2_1_entity_graphs

http://www.radcortez.com/jpa-entity-graphs/

Web应用程序的另一种选择是视图模式中的Open Session,它可以透明地启用“按需”提取,这可能值得一看。

http://blog.jhades.org/open-session-in-view-pattern-pros-and-cons/