1

我在 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 查询时,应该包含作为另一个表的值的对象的属性保留为空。即使我可以看到另一个表的值对象是由休眠创建的。

有人对这个问题有任何见解吗?

更新:

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

2 回答 2

1

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

from Gig g fetch all properties ... 

详情在这里

更新:您的gigVenue映射设置lazyno-proxy. 这意味着该属性将是 NULL,直到它第一次通过 getter 方法访问。这是使用字节码检测完成的,不是常用的。使用 HQLjoin fetch不会填充这样的属性;你必须fetch all properties像我上面描述的那样明确指定。

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

在这一点上,设置fetch="select"也是有问题的;您最好将其保留为默认join设置以启用使用外部连接进行获取。

于 2009-08-06T07:23:55.180 回答
0

Instrumentation 并不真正影响查询及其工作方式。你究竟为什么要在查询中进行提取?你想加快速度吗?

还有一个小问题,以防万一,你怎么知道值是空的?是通过java调试器还是通过实际调用“get”方法?使用检测,该字段通常为空,直到您实际请求该字段。

于 2009-08-06T09:12:33.243 回答