【问题标题】:Does hibernate use joins to auto-load related objectshibernate 是否使用连接来自动加载相关对象
【发布时间】:2015-09-01 12:11:14
【问题描述】:

考虑两个相关的对象BillBillItem。所有账单都有几个账单项目。 Bill 类有 getItems,它被配置为带有急切获取的 OneToMany

如果我选择一组返回 5 张账单的账单(比如今天为一位客户)。每张账单都有几个账单项目。

Hibernate 是否会在 BillBillItem 表上使用连接来一次性加载详细信息?或者 hibernate 会使用 n+1 个查询,其中 n 是账单数量?

如果使用连接查询不是默认行为,在这种情况下有没有办法配置 Hibernate 以使用连接?或者这是否需要使用 HQL 和一些自定义编码来进行映射?

编辑: 我想这里已经介绍过了:JPA eager fetch does not join

【问题讨论】:

  • 您可以在persistence.xml中启用sql日志以查看正在执行的实际查询
  • 我相信您可以进行 EAGER 加载,并且每次都带上 BillItems,或者您可以延迟加载它们,仅当您实际进行第二次(或第三次等)查询时决定使用该字段。虽然不确定它是如何工作的,但 EAGER 也可能更快地执行多个查询——这很奇怪,因为这样会使 de 选项变得毫无用处。

标签: java hibernate


【解决方案1】:

答案是“视情况而定”。在一般情况下,当粗心地获取实体时,很容易获得可怕的 N+1 选择。这就是为什么您需要观察查询的性能并验证它们是否按照您的预期进行。

有很多关于 JPA/Hibernate 性能优化的讨论,包括避免使用 JOIN 进行 N+1 选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多