我有一个简单的问题。我在我们的项目中发现了这个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"并删除它
发布于 2010-12-07 17:20:08
我认为Fetch Mode和time of fetch是不完全重叠的概念。
Lazy="true|false"
控制关联是急切加载还是按需加载。
fetch="select|subselect|join|batch"
控制实体或集合的加载方式,何时需要加载它。
因此,为了回答您的问题,拥有fetch="select"
意味着:
false“第二个SELECT用于检索关联的实体或集合。除非您通过指定lazy=”
“显式禁用延迟获取,否则第二个select将仅在您访问关联时执行。”(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"
,将执行相同的select,不同之处在于它将被急切地执行。希望这是有意义的。
在这里也可以看到:http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies
发布于 2010-12-07 16:34:46
如果您将其设置为lazy,那么如果不需要,外部映射将不会选择员工。fetch显示了如果需要,它将如何查询员工。
https://stackoverflow.com/questions/4374528
复制相似问题