Hibernate XML Mapping:Lazy False还是Fetch Select?

时间:2010-12-07 08:09:53

标签: hibernate mapping lazy-loading

我有一个简单的问题。我在项目中找到了这个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”

2 个答案:

答案 0 :(得分:43)

我认为获取模式和获取时间是不完全重叠的概念。

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会延迟加载集合并使用select加载它。如果设置lazy="false",则会执行相同的选择,不同之处在于它会被急切执行。希望这是有道理的。

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

答案 1 :(得分:1)

如果将其设置为延迟,则外部地图将不会选择员工(如果不需要)。获取显示如果必要,它将如何查询员工。

相关问题