hibernate如何决定默认使用哪个FetchMode?

时间:2016-11-23 10:46:06

标签: java hibernate jpa-2.0

在我们的项目中,我们使用Hibernate,在日志中我们观察到当我们没有指定FetchMode时,它有时会使用Join,有时候会选择Select(因为我理解它是FetchMode)。

如果没有指定,Hibernate如何决定使用哪个FetchMode?

这有什么规格吗?任何代码行?任何文章?

3 个答案:

答案 0 :(得分:7)

如果字段上没有Hibernate注释@Fetch,则此字段的默认FetchMode为:

  • 如果此字段的FetchType = EAGER,则FetchMode = JOIN。
  • 否则,FetchMode = SELECT。

此信息的来源是代码本身(Hibernate 5.0):HEREHERE,最重要的是HERE

答案 1 :(得分:1)

在未指定FetchMode并且FetchType为EAGER的情况下查看生成的SQL,Hibernate中的默认值为JOIN

可悲的是,我无法在官方文档中找到这些信息。

关于使用SELECT,即使JOIN是默认设置,我认为有些查询无法在单个查询中解析,like this

  

但是如果你允许B没有C,那么Hibernate只是检查存在   C在它加载B的那一刻。但是用于检查存在的SELECT就是   效率低,因为相同的SELECT可能不只是检查存在,但是   加载整个对象。懒惰的装载消失了。

答案 2 :(得分:0)

如果未使用@Fetch注释字段,则此字段的默认FetchMode取决于FetchType和查询方式:

  • FetchType.LAZY => FetchMode.SELECT
  • FetchType.EAGER
    • 通过ID(Session.get)=> FetchMode.JOIN
    • JPQL查询=> FetchMode.SELECT
    • 标准API查询=> FetchMode.SELECT