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 :

jointures dans une requête polymorphiques


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut jointures dans une requête polymorphiques
    Bonjour

    Voici les données schématisées de mon problème :

    J'ai une classe abstraite AbstractAnimal
    2 classes concrètes Chien et Chat qui étendent la classe AbstractAnimal
    Les 2 classes concrètes ont une relation sur la classe Croquette (vous foutez pas de ma gueule, je suis pas inspiré pour les exemples...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Chien extends AbstractAnimal {
     
        Long id;
     
        Set<Croquette> croquettes;
     
        ...
     
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Chat extends AbstractAnimal {
     
        Long id;
     
        Set<Croquette> croquettes;
     
        ...
     
    }
    Les classes AbstractAnimal, Chien, Chat et Croquette sont mappées par Hibernate. La stratégie de mapping de l'héritage entre AbstractAnimal / Chien et AbstractAnimal / Chat est "table per subclass". Les relations entre Chien / Croquette et Chat / Croquette sont effectuées via des <set> dans les hbm. Ces relations sont lazy.

    Mon problème : je veux effectuer une requête polymorphique (sur AbstractAnimal qui me ramène des Chien et des Chat) avec une jointure sur croquette pour éviter le lazy-loading.

    Voici ma requête HQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from AbstractAnimal a left join fetch a.croquettes
    Cette requête ne marche pas. J'ai une erreur Oracle m'informant que j'ai des noms de colonnes ambigus dans la requête SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: ORA-00918: column ambiguously defined
    En effet, Hibernate crée une requête SQL avec deux jointures vers la table Croquette (une pour la relation avec Chien et une pour la relation avec Chat) mais avec deux alias identiques. D'où le problème.

    Si je renomme les attributs "croquettes" des classes concrètes en "chienCroquettes" et "chatCroquettes" dans mes classes et dans le mapping et que je crée la requête HQL suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from AbstractAnimal a left join fetch a.chienCroquettes left join fetch a.chatCroquettes
    ça marche.


    Dans ce cas précis où :
    - je sollicite des relations dans des sous-objets portées par des attributs ayant le même nom
    - dans une requête polymorphique

    il semblerait donc vraiment qu'il y ait un problème dans le mécanisme de la construction de la requête SQL par Hibernate.

    Bon ! Voilà ! Est-ce que je m'y prends mal ? est-ce une limitation de Hibernate ?

    Bref j'aimerais trouver une autre solution que renommer tous les fields porteur de relation ayant le même nom dans différent objets de l'arbre d'héritage. Surtout que dans mon cas réel, il y a énormément plus d'impacts que dans le petit exemple ci-dessus.

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Salut,
    Je pense que la solution la plus simple serait que tu fasse remonter cette relation directement dans la classe de base AbstractAnimal, étant donné qu'elle est mappée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       public abstract class AbstractAnimal {
            Set<Croquette> croquettes = new HashSet<Croquette>();
       }
    Les classes filles héritent de la relation, et ta requête HQL reste donc ce que tu as essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from AbstractAnimal a left join fetch a.croquettes
    Voilà.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Oui je suis tout à fait d'accord avec toi et c'est ce que j'ai fait lorsque c'était possible. Mais les relations qui me posent problèmes ne sont pas dans toutes les sous classes.

    En ce sens mon exemple était incomplet. Pour schématiser, ajoutons à mon exemple une classe Varan qui étend la classe AbstractAnimal et qui n'a pas la relation vers Croquette (Je pars du postulat qu'un varan ne mange pas de croquette...).

    Merci tout de même pour ta réponse

Discussions similaires

  1. Plusieurs jointures dans une requête
    Par mouss4rs dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/09/2011, 15h19
  2. bouclage dans une requête SQL aec jointure
    Par lbar012001 dans le forum SQL
    Réponses: 4
    Dernier message: 31/10/2007, 17h58
  3. Remplacer une jointure dans une requête DELETE
    Par lorant dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/11/2006, 19h46
  4. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  5. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05

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