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

时间:2012-03-21 13:15:36

标签: hibernate lazy-evaluation

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

3 个答案:

答案 0 :(得分:21)

{/ 1}}属性告诉hibernate 何时来获取孩子。

lazy属性告诉hibernate 如何来获取孩子。

当你说

  

lazy = true属性允许延迟加载父级和子级   集合和相同的东西fetch =“select”属性

这是不正确的。选择提取策略与关闭延迟加载不同。事实上,from the documentation

  

选择提取:第二个SELECT用于检索关联的   实体或集合。除非您明确禁用延迟抓取   指定lazy =“false”,此第二个选择仅在执行时执行   你访问该协会。

答案 1 :(得分:14)

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

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

当我们说fetch="join"时,它总会触发一个查询来从数据库中获取关联对象。

答案 2 :(得分:1)

为了解决hibernate中n个查询(父子关系)的n + 1选择问题,我们使用fetch =“join”而不是fetch =“select”。延迟设置决定是否在加载父对象时加载子对象。你需要这样设置父类的相应hibernate映射文件.Lazy = true(表示不加载子)默认情况下,子对象的延迟加载为true