我有一些嵌套对象,Package-> Documents-> Pages。该包包含一组文档,该文档包含一组页面。我与Pages-> Documents and Documents->页面的关系都设置为EAGER,因为当我请求包时,我希望它能够获得所有文档以及所有页面。
现在我还有另一项要求,只能获取Package-> Documents,但我也不想检索Document-> Pages,因为这个查询需要更高效,并且不需要数据。
有没有办法使用相同的模型对象来关闭EAGER?或者有没有办法可以将它更改为LAZY然后强制它急切而不必遍历包中的每个文档并调用getPages()?
这是首选,最有效的方法吗?
答案 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/