1

hbm.xmlに、次のように多対1の関連付けを設定しています。

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

2 に答える 2

1

アソシエーションプロキシの代わりにバイトコードインストルメンテーションを使用しているため(なぜ?)、クエリで「すべてのプロパティをフェッチ」を指定する必要があります。

from Gig g fetch all properties ... 

詳細はこちら

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

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

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

于 2009-08-06T07:23:55.180 に答える
0

インストルメンテーションは、クエリとその動作には実際には影響しません。なぜクエリでフェッチを実行しているのですか?あなたは物事をスピードアップしようとしていますか?

また、念のため、値がnullであることをどのようにして知ることができますか?それはJavaデバッガーを介したものですか、それとも実際に「get」メソッドを呼び出すことによるものですか?インストルメンテーションでは、実際にフィールドを要求するまで、フィールドは通常nullになります。

于 2009-08-06T09:12:33.243 に答える