hibernate plusieurs-à-une requête hql, quand inner join fetch biens qui ne sont pas associés
J'ai un plusieurs-à-une association de ce genre, 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>
Et je suis de l'utilisation des instruments pour faire de la vraie chargement paresseux.
MAIS lorsque j'exécute une requête hql avec un inner join fetch à l'autre table, l'établissement qui doit contenir l'objet qui est l'autre de la table de valeur, est laissé null. Même si je peux voir de l'autre table de la valeur de l'objet créé par hibernate.
Quelqu'un a une idée dans 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>
- Pouvez-vous poster le réel de la requête et le 2ème de la cartographie?
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes à l'aide de code octet de l'instrumentation à la place de l'association de l'utilisation de proxy (pourquoi?) vous devez spécifier "récupération de toutes les propriétés" dans votre requête:
Détails sont ici
Mise à jour: Votre
gigVenue
cartographie est miselazy
àno-proxy
. Ce que cela signifie, c'est que la propriété sera NULLE jusqu'à sa première accessibles via la méthode get. Ceci est fait en utilisant byte-code de l'instrumentation et n'est pas quelque chose qui est couramment utilisé. À l'aide de requêtes HQLjoin fetch
ne sera PAS remplir un tel bien; vous devez spécifier explicitementfetch all properties
comme je l'ai décrit ci-dessus.Envisager de mettre en
lazy="proxy"
à la place (qui est en fait la valeur par défaut pour plusieurs-à-un) pour initialiser votre propriété avec un proxy de l'objet contenantgigVenue
identifiant lors de la première sélectionnez, puis récupérer l'entité réelle une fois que vous accédez à l'un desGigVenue
's méthodes. À l'aide dejoin fetch
dans les requêtes HQL travaillera également dans ce cas, l'extraction complèteGigVenue
exemple lors de la première sélection.Sur cette note, le réglage de
fetch="select"
est également discutable; vous êtes probablement mieux de laisser la valeur par défaut dejoin
paramètre pour activer à l'aide de jointures pour récupérer.L'Instrumentation n'a pas vraiment d'incidence sur les requêtes et comment ils fonctionnent. Exactement pourquoi faites-vous le chercher dans la requête? Êtes-vous essayer d'accélérer les choses?
Et aussi une petite question, juste au cas où, comment avez-vous savoir la valeur est null? c'est que via le débogueur java ou est-ce que le fait de l'appel de la méthode "get"? Avec l'instrumentation, le champ sera généralement null, jusqu'à ce que vous demandez pour le champ.