Mise en veille prolongée plusieurs à une requête HQL, quand jointure interne chercher propriété non associée

StackOverflow https://stackoverflow.com/questions/1237346

Question

J'ai beaucoup à une association créée comme celui-ci, dans le 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>

J'utilise l'instrumentation de faire du vrai chargement paresseux.

Mais quand je lance une requête HQL avec un INNER JOIN chercher à l'autre table, la propriété qui doit contenir l'objet qui est la valeur de l'autre table, est laissée comme nulle. Même si je peux voir l'objet de la valeur de l'autre table en cours de création par mise en veille prolongée.

Quelqu'un at-il aperçu ce problème?

Mise à jour:

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>
Était-ce utile?

La solution

Puisque vous utilisez l'instrumentation de code octet au lieu d'association mandatement (pourquoi?), Vous devez spécifier « récupérer toutes les propriétés » dans votre requête:

from Gig g fetch all properties ... 

Les détails sont ici

Mise à jour: Votre cartographie gigVenue est mise à lazy no-proxy. Ce que cela signifie est que la propriété sera NULL jusqu'à ce que sa première accessible via getter. Cela se fait en utilisant une instrumentation de code d'octets et n'est pas quelque chose qui est couramment utilisé. L'utilisation HQL join fetch ne remplira pas une telle propriété; vous devez spécifier explicitement fetch all properties comme je l'ai décrit ci-dessus.

Tenir compte la mise lazy="proxy" à la place (qui est en fait la valeur par défaut pour beaucoup à un) qui initialiser votre propriété avec un objet proxy contenant identifiant de gigVenue lors de la sélection initiale, puis récupérez l'entité réelle une fois que vous accédez à l'une des méthodes de GigVenue. L'utilisation join fetch dans HQL travaillera également dans ce cas, aller chercher par exemple plein GigVenue lors de la sélection initiale.

Sur cette note, la mise en fetch="select" est également discutable; vous êtes le plus susceptible mieux laisser au paramètre par défaut de join pour permettre l'utilisation des jointures externes pour aller chercher.

Autres conseils

Instrumentation n'affecte pas vraiment les requêtes et comment ils fonctionnent. Pourquoi exactement ce que vous faites dans l'opération d'extraction de la requête? Essayez-vous d'accélérer les choses?

Et aussi une petite question, juste au cas où, comment voulez-vous sais la valeur est nulle? est que via le débogueur Java ou est-ce en appelant en fait la méthode « get »? Avec l'instrumentation, le champ sera généralement nul, jusqu'à ce que vous demandez réellement sur le terrain.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top