2009-08-06 7 views
1

私は多対一関連はのhbm.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クエリを実行すると、他のテーブルの値であるオブジェクトを含むべきプロパティはnullのままになります。私は他のテーブルの値のオブジェクトが休止状態によって作成されているのを見ることができます。

誰もがこの問題の洞察を持っていますか?

更新:

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

実際のクエリと2番目のマッピングを投稿できますか? – ChssPly76

答えて

1

あなたはバイトコード計測の代わりに、関連のプロキシを(なぜ?)を使用しているので、あなたのクエリ内の「すべてのプロパティの取得」を指定する必要があります。

from Gig g fetch all properties ... 

詳細are here

更新:gigVenueのマッピングが設定されていますlazyno-proxy。その意味は、最初にgetterメソッドを使ってアクセスするまで、プロパティはNULLになります。これはバイトコード計測を使用して行われ、一般的に使用されるものではありません。 HQL join fetchを使用すると、そのようなプロパティは設定されません。上記のようにfetch all propertiesを明示的に指定する必要があります。

あなたはGigVenue年代の1にアクセスしたら、実際のエンティティを取得し、最初の選択時にgigVenue識別子を含むプロキシオブジェクトを使用してプロパティを初期化するであろう(それは実際には多対一のデフォルトです)の代わりにlazy="proxy"の設定を検討しますメソッド。 HQLでjoin fetchを使用すると、初期選択時に完全なGigVenueインスタンスをフェッチすることもできます。

このノートでは、fetch="select"を設定することも疑問です。デフォルトのjoinに設定しておくと、フェッチに外部結合を使用できるようになる方がよいでしょう。

+0

それは面白いですね。ノープロキシを使用している理由は、1対1が常にそうでなければフェッチするためです(常に望ましいとは限りません)。したがって、多対一の使用プロキシではなく、1対1で真のレイジーフェッチを行うには、プロキシや計測器を使用しないように見えます。 – Gilgad

+0

、詳細についてはhttp://stackoverflow.com/questions/965059/how-to-lazy-load-a-one-to-one-composition-via-hqlを参照してください。 – Gilgad

+0

拘束されていない1対1の特別なケースです。まだ説明がない場合は、この説明をご覧ください。https://www.hibernate.org/162.html正直言って、1対1の関連付けのもう一方の端を選択することは恐ろしいパフォーマンスにつながるケースは見たことがありません - それらは常にPKベースです。 – ChssPly76

0

計測は実際にはクエリに影響を与えません。クエリでフェッチを実行する理由は何ですか?物事をスピードアップしようとしていますか?

また、ちょっと質問がありますか?を知っていますか?それはJavaデバッガ経由か、実際には "get"メソッドを呼び出すことですか?計測を使用すると、実際にフィールドを要求するまで、フィールドは通常nullになります。

+0

はい私は最初のクエリの後にヒットのヒープ全体を停止しようとしています。 そして、はい、私はなぜそれがちょうどプロパティにそれを突き出すていない私はゲッターと呼ばいったん値はデシベルからフェッチされるだろうが、私はすでにオブジェクトをフェッチしてきたように(と私が作成し、その型のオブジェクトを見ることができます)知っています既に? – Gilgad

+0

計測は照会には影響しません。私は詳細な説明で私の答えを更新しました – ChssPly76

関連する問題