在2个查询中与CF9 ORM一对一或多对一

时间:2011-09-14 00:09:22

标签: sql hibernate orm coldfusion coldfusion-9

我有两个对象

HomeFeatures
<cfcomponent persistent="true">
    <cfproperty name="id" column="homeFeatureid">
    <cfproperty name="tabTitle">
    <cfproperty name="title">
    <cfproperty name="description">
    <cfproperty name="sort">
    <cfproperty name="moretext">
    <cfproperty name="url">
    <cfproperty name="active">
    <cfproperty name="media" fieldtype="many-to-one" fkcolumn="mediaid" cfc="media" lazy="false" fetch="join" missingrowIgnored="true">
</cfcomponent>

Media
<cfcomponent persistent="true" table="cms.dbo.media">
    <cfproperty name="id" column="mediaid">
    <cfproperty name="filename">
</cfcomponent>

因此,我有多个homeFeatures,每个都有一个与之关联的媒体项。相同的媒体项可以与多个homeFeatures相关联,但每个homeFeature只能有一个由homeFeatures.mediaid连接的媒体项。

如果我执行了一个entityLoad(“homeFeatures”),我将获得homeFeatures的1个查询和homeFeatures中每个行的媒体表的1个查询。换句话说,这是N + 1问题。为什么?这应该是两个查询总数,一个用于获取所有homeFeatures,另一个用于获取由homeFeatures确定的列表中所有媒体ID的媒体。我正试图按照http://www.rupeshk.org/blog/index.php/2009/09/coldfusion-orm-performance-tuning-fetching-strategy/和adobe文档中的定义进行“急切”加载。

在这个特定视图中,我需要访问每个条目的媒体记录,这就是为什么我将懒惰设置为false。我发誓我已经尝试了lazy = false | true,batch = 999,fieldtype = one-to-one | many-to-one,fetch = join | select的每次迭代,并且所有这些迭代产生相同的N + 1问题。

有什么想法吗?请帮忙!

1 个答案:

答案 0 :(得分:0)

在这种情况下,解决方案是batchsize。通过在cfc或cfproperty上指定,我们可以设置批量大小,以便相关项目按组进行批处理,而不是单独进行。