2009-08-06 27 views
1

我有很多-to-one关联设置这样,在你hml.xml:冬眠多到一个HQL查询,当内部连接获取财产没有关联

<many-to-one name="gigVenue" 
class="blah.blah.xxx" fetch="select" 
lazy="no-proxy" not-null="true" > 
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" /> 
</many-to-one> 

,我使用仪器做真正的懒加载。

但是,当我运行一个hql查询与另一个表的内部联合提取时,应该包含另一个表的值的对象的属性保留为空。即使我可以看到其他表的值由hibernate创建的对象。

有没有人有任何洞察到这个问题?

更新:

from Gig g inner join fetch g.gigVenue gv where g.artistId = :artistId and (g.territoryId = -1 or g.territoryId = :territoryId) order by g.gigDatetime desc 

<set name="gigs" inverse="true" lazy="true" table="DSP_GIG" fetch="select"> 
<key> 
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" /> 
</key> 
<one-to-many class="blah.blah.Gig" /> 
</set> 
+0

你可以发布实际查询和第二个映射吗? – ChssPly76 2009-08-06 07:06:39

回答

1

由于您使用的字节代码装备,而不是代理协会(为什么?)你需要指定查询“获取所有属性”:

from Gig g fetch all properties ... 

详细是here

更新:您的gigVenue映射设置为lazyno-proxy。这意味着该属性在通过getter方法首次访问之前将为NULL。这是通过使用字节码检测来完成的,而不是通常使用的。使用HQL join fetch不会填充这样的属性;如上所述,您必须明确指定fetch all properties

考虑设置lazy="proxy",而不是(这实际上是对许多到一个默认的),这将在最初的选择包含gigVenue标识符的代理对象初始化属性,则检索实际的实体,一旦你进入GigVenue之一的方法。在HQL中使用join fetch也可以在这种情况下工作,在初始选择期间获取完整的GigVenue实例。

在该说明中,设置fetch="select"也是有问题的;您最好将其保留为默认的join设置,以启用使用外部连接进行抓取。

+0

好的,这很有趣。我们使用无代理的原因是因为一对一会总是以其他方式获取(并非总是令人满意)。所以看起来对于多对一的使用代理而言,一对一地进行真正的懒惰提取使用无代理和工具。 – Gilgad 2009-08-07 02:40:54

+0

并参阅http://stackoverflow.com/questions/965059/how-to-lazy-load-a-one-to-one-composition-via-hql了解更多信息。 – Gilgad 2009-08-07 02:44:20

+0

无约束的一对一是一种特殊情况。如果你还没有,请看https://www.hibernate.org/162.html。字节码工具确实是该场景中的唯一解决方案,但说实话,我从来没有见过选择一对一关联的另一端导致可怕性能的情况 - 这些总是基于PK的。 – ChssPly76 2009-08-07 03:01:52

0

检测并不影响查询以及它们的工作方式。为什么你在查询中进行提取?你想加快速度吗?

而且还有一个小问题,万一你如何知道的值为空?是通过java调试器还是通过实际调用“get”方法?使用仪器仪表时,该字段通常为空,直到您真正要求该字段。

+0

是的我试图在初始查询后停止整个堆的命中数据库。 是的,我知道这个值会从DB中获取一次我打电话,吸气但我已经获取的对象(我可以看到创建类型的对象),为什么不只是推,在财产已经? – Gilgad 2009-08-06 11:37:57

+0

工具不影响查询,映射。我已经通过详细的解释更新了我的答案 – ChssPly76 2009-08-06 16:29:56