在我们的项目中,我们使用Hibernate,在日志中我们观察到当我们没有指定FetchMode时,它有时会使用Join,有时候会选择Select(因为我理解它是FetchMode)。
如果没有指定,Hibernate如何决定使用哪个FetchMode? p>
这有什么规格吗?任何代码行?任何文章?
答案 0 :(得分:7)
如果字段上没有Hibernate注释@Fetch,则此字段的默认FetchMode为:
答案 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
:
Session.get
)=> FetchMode.JOIN
FetchMode.SELECT
FetchMode.SELECT