2009-08-06 50 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