休眠 (JPA) 如何执行预先查询,加载所有子对象

2022-09-02 10:12:48

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

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

假设一个模型的类中有一组。OrderOrderLines

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

也许更重要的是,有没有办法拉入所有子对象,无论有多深?我们有大约10-15个类,对于服务器,我们将需要加载所有内容...我避免使用,因为这意味着它总是很渴望,特别是Web前端加载所有内容 - 但也许这就是要走的路 - 这就是你所做的吗?我似乎记得我们之前尝试过这个,然后得到非常慢的网页 - 但也许这意味着我们应该使用二级缓存?FetchType.EAGER


答案 1

更改注释是 IMO 的一个坏主意。因为它不能在运行时更改为懒惰。最好让一切都变得懒惰,并根据需要获取。

我不确定我是否理解你的问题没有映射。左联接 fetch 应该是您描述的用例所需的全部内容。当然,如果订单线的父订单具有订单,您将获得每个订单行的订单。


答案 2

我不确定是否在EJBQL中使用fetch关键字,您可能会将其与注释混淆...

您是否尝试过将 FetchType 属性添加到您的关系属性?

@OneToMany(fetch=FetchType.EAGER)?

看:

http://java.sun.com/javaee/5/docs/api/javax/persistence/FetchType.html http://www.jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple


推荐