在HBM.XML中,我有一个这样的协会建立:

<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查询时,应包含另一个表值的对象的属性为null。即使我可以看到另一个表值的对象是由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>
有帮助吗?

解决方案

由于您使用的是字节代码仪器而不是关联代理(为什么?),您需要在查询中指定“获取所有属性”:

from Gig g fetch all properties ... 

细节是 这里

更新: 您的 gigVenue 映射是设置 lazyno-proxy. 。这意味着该属性将是零的,直到首次通过Getter方法访问其属性为止。这是使用字节代码仪器完成的,不是常用的。使用HQL join fetch 不会填充这样的财产;您必须明确指定 fetch all properties 正如我所描述的。

考虑设置 lazy="proxy" 相反(这实际上是多对一的默认值),它将用包含的代理对象初始化您的属性 gigVenue 在初始选择期间的标识符,然后在访问其中一个时检索实际实体 GigVenue的方法。使用 join fetch 在这种情况下,在HQL中也将起作用 GigVenue 实例在初始选择期间。

在此注意,设置 fetch="select" 也值得怀疑;您很可能最好将其保留在默认情况下 join 设置以使用外部连接以获取。

其他提示

仪器并不真正影响查询及其工作方式。您为什么要在查询中进行获取?您是否正在尝试加快速度?

也是一个小问题,以防万一 知道 值是空的?是通过Java调试器还是通过实际调用“ Get”方法?使用仪器,该字段通常为无效,直到您实际要求该字段为止。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top