IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Héritage et requête HQL


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Héritage et requête HQL
    Bonjour,
    je suis sur un projet avec Hibernate où je souhaiterai avec une requéte HQL charger une classe X sans charger les classes qui héritent de cette classe X.

    Ma requête effectue une jointure avec une autre classe Y.
    Pour faire simple voilà ma requête :

    "FROM X as x left outer join fetch x.y"

    Pour le moment ma requête charge bien x et y mais aussi toutes les classes qui héritent de x.

    Comment puis-je faire pour ne charger que la classe X sans les classes filles ?

    Merci d'avance,

    Deape

  2. #2
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Ce que tu constates correspond à la fonctionnalité de polymorphisme implicite et on l'illustre souvent à l'extrême avec la requête HQL "from Object" qui retournerait toutes les instances d'entités de ton mapping.

    La fonctionnalité "inverse" s'appelle le polymorphisme explicite et elle s'active en précisant polymorphism="explicit" sur la classe mère de la hiérarchie.
    Avec ça, ta requête HQL se limitera à la table correspondant à la classe citée et il ne devrait plus y avoir de jointure ouverte.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    D'abord merci pour ta réponse rapide.
    Grace a toi j'ai pu trouver dans la doc Hibernate, les trois lignes qui parlent de mon probléme :

    Le polymorphisme
    explicite signifie que les instances de la classe ne seront retournées que par une requête qui
    utilise explicitement son nom et que seules les instances des classes filles déclarées dans les
    éléments <subclass> ou <joined-subclass> seront retournées.
    J'ai donc mis en place un mappage par classe concréte avec <union-subclass>

    Mais rien a faire je me retrouve encore avec une requête qui fait une jointure avec le classes filles...

    Voila mon fichier de mappage :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-cascade="none">
    	<class name="Title" 
    		table="TITLE" 
    		dynamic-insert="false" 
    		dynamic-update="false"
    		polymorphism="explicit">
    		<id name="idTitle" type="java.lang.Long" unsaved-value="null">
    			<column name="ID_TITLE" sql-type="BIGINT" />
    	    	<generator class="native">
    	    	</generator>
    		</id>
    		<version name="version" type="int" column="VERSION"/>
     
     
    		<property name="author" type="java.lang.String">
    			<column name="AUTHOR" not-null="false" unique="false" sql-type="CHARACTER VARYING(1024)">
    			</column>
    		</property>
    		<property name="name" type="java.lang.String">
    			<column name="NAME" not-null="false" unique="false" sql-type="CHARACTER VARYING(1024)">
    			</column>
    		</property>
     
     
    		<set 
    			name="itemsLoaned" 
    			inverse="false"
    		 	where="out='true'"					
    			order-by="TITLE_LOANED_FK"
    		 	lazy="true" fetch="select">
    		 	<key foreign-key="ITEM_TITLE_LOANED_FKC">
    		 		<column name="TITLE_LOANED_FK"/>
    		 	</key>
    		 	<one-to-many class="Item"/>
            </set>		 			
     
     
    		<list 
    			name="items" 
    			inverse="true"
    		 	cascade="delete"
    		 	lazy="true" fetch="select">
    		 	<key foreign-key="ITEM_TITLE_FKC">
    		 		<column name="TITLE_FK"/>
    		 	</key>
    		 	<list-index column="TITLE_ITEM_IDX"/>
    		 	<one-to-many class="Item"/>
            </list>		 			
     
     
    		<set 
    			name="itemsNotLoaned" 
    			inverse="false"
    		 	where="out='false'"					
    			order-by="TITLE_NOT_LOANED_FK"
    		 	lazy="true" fetch="select">
    		 	<key foreign-key="ITEM_TITLE_NOT_LOANED_FKC">
    		 		<column name="TITLE_NOT_LOANED_FK"/>
    		 	</key>
    		 	<one-to-many class="Item"/>
            </set>		 			
    		<union-subclass
    	 		name="VideoRecord"
    	 		table="VIDEO_RECORD"
    	 		dynamic-insert="true"
    			dynamic-update="true"
    			abstract="false">
     
     
    		<property name="casting" type="java.lang.String">
    			<column name="CASTING" not-null="false" unique="false" sql-type="CHARACTER VARYING(1024)">
    			</column>
    		</property>
    		<property name="duration" type="java.lang.Integer">
    			<column name="DURATION" not-null="false" unique="false" sql-type="NUMERIC">
    			</column>
    		</property>	
    		 </union-subclass>
    		<union-subclass
    	 		name="AudioRecord"
    	 		table="AUDIO_RECORD"
    	 		dynamic-insert="true"
    			dynamic-update="true"
    			abstract="false">
     
     
    		<property name="numberOfTracs" type="java.lang.Integer">
    			<column name="NUMBER_OF_TRACS" not-null="false" unique="false" sql-type="NUMERIC">
    			</column>
    		</property>
    		<property name="label" type="java.lang.String">
    			<column name="LABEL" not-null="false" unique="false" sql-type="CHARACTER VARYING(1024)">
    			</column>
    		</property>		
    		 </union-subclass>
    		<union-subclass
    	 		name="Book"
    	 		table="BOOK"
    	 		dynamic-insert="true"
    			dynamic-update="true"
    			abstract="false">
     
     
    		<property name="numberOfPages" type="java.lang.Long">
    			<column name="NUMBER_OF_PAGES" not-null="false" unique="false" sql-type="BIGINT">
    			</column>
    		</property>
    		<property name="isbn" type="java.lang.String">
    			<column name="ISBN" not-null="false" unique="false" sql-type="CHARACTER VARYING(1024)">
    			</column>
    		</property>
    		 </union-subclass>		
     
    	</class>
    </hibernate-mapping>
    Si tu as encore une piste pour moi, merci d'avance
    Deape

  4. #4
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Effectivement j'ai testé un cas similaire et j'ai constaté les limites du polymorphism="explicit"
    Je t'avoue que je l'ai jamais mis en oeuvre

    Par contre, on poussant un peu les tests, j'ai peut-être une suggestion (inspiré de cet article) ...

    En partant du principe que tu as une classe X dérivée en sous-classes Y, Z ...

    • D'un côté, tu conserves ta classe X + héritage et le mapping qui va avec (avec la stratégie de mapping d'héritage que tu veux)
    • De l'autre tu définis une nouvelle classe XLight équivalent à X mais sans les sous-classes (idéalement X peut hériter de XLight pour éviter la duplication de code).
    • La classe XLight aura son propre fichier de mapping (= copier/coller du mapping de X sans les héritages).
    • Le mapping de X mentionne polymorphism="explicit" (il fallait bien que je le recase )

    A partir de là, la requête "from XLight" réalisera la requête SQL sans jointure (puisqu'il n'y aura pas de sous-classage). Et la requête "from X" continuera de fonctionner à l'identique.

    Voir le lien si c'est pas clair (en transposant XLight = DocumentInfo, X = Document et l'héritage correspond au mapping du blob).

Discussions similaires

  1. Ajouter des jours à une date dans une requête HQL
    Par jojo el merou dans le forum Hibernate
    Réponses: 3
    Dernier message: 30/11/2007, 14h37
  2. Pb de requête HQL
    Par jc63 dans le forum Hibernate
    Réponses: 4
    Dernier message: 20/09/2007, 21h01
  3. requête HQL utilisant la réflexivité
    Par toomsounet dans le forum Hibernate
    Réponses: 1
    Dernier message: 20/04/2007, 23h06
  4. [Débutant] Requête HQL : le joker %
    Par tck-lt dans le forum Hibernate
    Réponses: 3
    Dernier message: 21/12/2006, 15h10
  5. Réponses: 2
    Dernier message: 24/08/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo