【问题标题】:Hibernate XML Mapping: Lazy False or Fetch Select?Hibernate XML 映射:Lazy False 还是 Fetch Select?
【发布时间】:2011-05-21 10:41:41
【问题描述】:

我有一个简单的问题。我在我们的项目中找到了这个 Hibernate 配置:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge"
    lazy="false"
    fetch="select">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

fetch="select" 不是基于Fetching Strategies 的“延迟加载所有集合和实体”。但是写 lazy="false" 意味着不要延迟加载。所以上面的配置说:“禁用延迟加载。启用延迟加载。”实际上,这意味着该属性是延迟加载的?

所以我可以将该配置缩短为:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge"
    fetch="select">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

但是 fetch="select" 不是默认模式吗?所以实际上,我可以声明相同的配置:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

我说的对吗?错误的?想法?谢谢

如果我想启用延迟加载,我必须添加 lazy="true" 并删除 lazy="false"

【问题讨论】:

    标签: hibernate mapping lazy-loading


    【解决方案1】:

    我认为 Fetch Mode 和 time of fetch 是不完全重叠的概念。

    Lazy="true|false" 控制关联是立即加载还是按需加载。

    fetch="select|subselect|join|batch" 控制实体或集合在需要加载时如何加载。

    所以,回答你的问题,fetch="select" 意味着:

    "第二个 SELECT 用于检索关联的实体或集合。除非您通过指定lazy="false" 明确禁用延迟获取,否则第二个选择将仅在您访问关联时执行。" (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching)

    这并不意味着延迟加载被禁用!这由lazy="true|false" 标志控制。 使用lazy="true"fetch="select",Hibernate 将延迟加载集合并使用选择加载它。如果你设置lazy="false",同样的选择会被执行,不同的是它会被急切地执行。希望这是有道理的。

    也请看这里:http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

    【讨论】:

      【解决方案2】:

      如果您将其设置为惰性,则外部地图在不需要时不会选择员工。 fetch 显示了它在必要时如何查询员工。

      【讨论】:

      • 添加这两个属性不是多余的吗?他们不会互相否定,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2014-10-13
      相关资源
      最近更新 更多