在我们的项目中,我们使用Hibernate,在日志中观察到它有时会在关系中使用Join,有时使用Select(我认为这是FetchMode),当我们没有指定FetchMode时。
如果没有指定FetchMode,Hibernate如何决定使用哪个FetchMode?
有没有针对此的规范?任何代码行?任何文章?
如果没有指定FetchMode,Hibernate如何决定使用哪个FetchMode?
有没有针对此的规范?任何代码行?任何文章?
如果一个字段没有使用@Fetch
注解,那么该字段的默认FetchMode
取决于FetchType
和查询方式:
FetchType.LAZY
=> FetchMode.SELECT
FetchType.EAGER
:
Session.get
) => FetchMode.JOIN
FetchMode.SELECT
FetchMode.SELECT
FetchMode
且FetchType为EAGER
时,查看生成的SQL语句,默认情况下Hibernate使用JOIN
。遗憾的是,我在官方文档中找不到这些信息。关于即使默认情况下使用JOIN
也使用SELECT
的情况,我认为有一些查询无法在单个查询中解决,例如这样:
但是如果您允许B没有C,则Hibernate在加载B时必须检查C的存在。但是,用SELECT检查存在性只是低效的,因为同一个SELECT不仅可以检查存在性,还可以加载整个对象。所以懒加载就消失了。