2010-12-07 44 views
16

我有一个简单的问题。我发现我们的项目与此Hibernate配置:休眠XML映射:延迟假或提取选择?

<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> 

取=“选择”表示“延迟加载所有集合和实体”的基础上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> 

但不取= “选择”默认模式?所以实际上,我可以声明相同的配置为:

<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 = “真”并删除为lazy = “假”

回答

38

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

Lazy="true|false"控制是否急切或按需加载关联。

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

因此,要回答你的问题,有fetch="select"表示:

“第二SELECT用于检索的关联实体或集合除非你明确指定lazy =关闭延迟加载。”假”,这第二次选择只会在您访问关联时执行。“ (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

0

如果您将其设置为懒惰,那么如果不需要,外部地图将不会选择员工。提取显示如果有必要,它将如何查询员工。

+0

添加这两个属性不是多余的?他们不会互相否定,对吧? – chris 2010-12-07 08:40:16