在hibernate中lazy ="true"和fetch ="select"有什么区别?

use*_*214 12 hibernate lazy-evaluation

lazy=true属性允许延迟加载父集合和子集合以及相同的事物fetch="select"属性.lazy="true"fetch="select"hibernate 之间有什么区别吗?

hvg*_*des 21

是.

lazy属性告诉hibernate 何时获取子项.

fetch属性告诉hibernate 如何获取子进程.

当你说

lazy = true属性启用父和子集合的延迟加载以及fetch ="select"属性相同的事物

这是不正确的.选择提取策略与关闭延迟加载不同.实际上,来自文档

选择提取:第二个SELECT用于检索关联的实体或集合.除非通过指定lazy ="false"显式禁用延迟提取,否则只有在访问关联时才会执行第二次选择.


小智 14

当我们说fetch="select",然后它将始终触发单独的查询以检索关联对象,即使它是lazy ="false".

但是,当我们说lazy ="true",这意味着它将在单独的查询中检索关联对象,但不是在加载对象时,而是在首次访问关联时.我们可以这样说list().size().

当我们说fetch="join"它将始终触发单个查询以从数据库获取关联对象.