【问题标题】:How to cascade @JoinFetch in EclipseLink?如何在 EclipseLink 中级联 @JoinFetch?
【发布时间】:2018-12-27 21:07:52
【问题描述】:

我有以下模型:订单有多个项目,项目有多个其他子项。这是一棵有好几层深的树。

我在所有 @OneToMany@JoinFetch 上都加载了 EAGER,在所有 @ManyToOne 上加载了 LAZY(以避免在 N+1 问题中的额外查询)。

根据How do I do a "deep" fetch join in JPQL?,我可以使用多个查询提示来预先加载整个树,但是,我更喜欢仅通过注释来执行此操作。

不幸的是,即使使用@JoinFetch 注释的整个树,似乎也只执行了 1 级深度的连接,导致对整个树进行多个查询而不是单个查询。

这些是我可以看到正在执行的查询:

Order - 所有子节点的左外连接。

OrderItem - 所有子级的左外连接。

...等所有级别。

我可以看到@JoinFetch 正在工作,但它只工作一层深。我想要实现的是加载整个树的单个查询。

虽然这一级深度加载确实帮助我将调用速度提高了 2 倍以上,但它们在一次加载大量实体​​时仍然不是最优的,因为每个实体意味着 5 个以上的额外查询。

有没有办法只加载带有注释的整个树,或者我应该手动设置多个查询提示来实现这一点?

James Sutherland here 的回答似乎不正确(关于递归工作)。

【问题讨论】:

  • 你试过@EntityGraph吗?这是join fetch 的替代方法,用于急切加载关联。

标签: java jpa eclipselink


【解决方案1】:

经过大量实验后,我得出结论,(设计?)的注释只能工作 1 级深度。为了完全控制,我放弃了注释并改用查询提示。追踪bug

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多