一尘不染

Hibernate(JPA)如何执行热切查询,加载所有子对象

hibernate

关于我之前的问题,我想确保所有子对象都已加载,因为我有多个线程可能需要访问数据(从而避免延迟加载异常)。我知道执行此操作的方法是在查询(EJB QL)中使用“fetch”关键字。像这样:

select distinct o from Order o left join fetch o.orderLines

假设模型中包含一个OrderOrderLines

我的问题是,似乎需要“ distinct”关键字,否则我似乎会Order为每个关键字找回一个OrderLine。我做对了吗?

也许更重要的是,是否有一种方法可以拉入所有子对象,无论深度如何?我们大约有10-15个类,对于服务器,我们将需要加载所有内容…我避免使用FetchType.EAGER它,因为这意味着它一直很渴望,尤其是Web前端加载了所有内容-
但这也许是可行的-你做什么?我似乎记得我们曾经尝试过此方法,然后获得了非常慢的网页-但这也许意味着我们应该使用二级缓存?


阅读 390

收藏
2020-06-20

共1个答案

一尘不染

更改注释不是IMO的好主意。由于无法在运行时将其更改为惰性。最好使所有内容都变得懒惰,并根据需要获取。

我不确定在没有映射的情况下是否理解您的问题。左连接提取应该是您描述的用例所需要的。当然,如果订单行有一个订单作为其父订单,那么您将为每个订单行取回订单。

2020-06-20