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 :

One-to-one sur 2 classes = 1 select + 2 outer join


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut One-to-one sur 2 classes = 1 select + 2 outer join
    Bonjour à tous,

    j'ai deux classes AntivirusFirewall et AntivirusFirewallInstallation, qui sont liées tous les deux par une relation one-to-one, telle que définit de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <union-subclass name="AntivirusFirewall" table="av_fw">
     
    	<property column="numdossier" name="numDossier" not-null="true" type="string" />
     
    	<one-to-one cascade="all" fetch="join" class="AntivirusFirewallInstallation" lazy="false" name="Installation" />
     
    </union-subclass>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <class name="AntivirusFirewallInstallation" table="av_fw_installation">
     
    	<id column="cle" name="Cle" type="string">
    		<generator class="foreign">
    			<param name="property">AntivirusFireWall</param>
    		</generator>
    	</id>
     
    	<property column="datecreat" name="Date" type="date" />
     
    	<one-to-one cascade="all" fetch="join" class="AntivirusFirewall" lazy="false" name="AntivirusFirewall" />
    </class>
    Le problème est qu'Hibernate me génère la requête suivante (que j'ai simplifié) :

    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
     
        select
            this_.iduser as iduser109_2_,
            this_.numdossier as referer109_2_,
            avf2_.cle_finale as cle1_116_0_,
            avf2_.datecreat as datecreat116_0_,
            avf3_.iduser as iduser109_1_,
            avf3_.numdossier as referer109_1_,
        from
            av_fw this_ 
        left outer join
            av_fw_installation avf2_ 
                on this_.iduser=avf2_.cle_finale 
        left outer join
            av_fw avf3_ 
                on avf2_.cle_finale=avf3_.iduser 
        where
            this_.numdossier=?
    Comme vous pouvez le constater, pour un accès à seulement deux tables, Hibernate génère un select sur la table AntivirusFirewall, un outer join sur la table AntivirusFirewallInstallation pour récupérer l'installation associée, et de nouveau un outer join sur la table AntivirusFirewall pour récupérer l'antivirus associée à l'installation. Je pense que le dernier outer join est inutile puisque les informations qu'il récupère sont exactement les mêmes que pour le select original.

    Est-ce qu'il y a moyen de changer mon mapping pour éviter le dernier outer join, consommateur inutile de ressources ?

    Merci par avance pour vos réponses,
    MiniMarch

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Et en faisant avec un many to one d'un coté (avec unique="true") et un one to one de l'autre, tel que dans la doc :
    http://www.hibernate.org/hib_docs/v3...irectional-121

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    J'ai donc essayé de suivre les instructions de la doc (merci pour l'info). La requête est désormais correctement formée (tout du moins de la façon dont je l'aurai fait à la main) et ne génère pas d'erreur.

    MAIS il me crée une seconde requête permettant de récupérer l'installation, avec un outer join permettant de récupérer l'antivirus. Et en plus, cette dernière requête retourne une erreur (l'identifiant demandé n'est pas présent).

    Cela ne marche donc pas.

    Est-ce que le fait que la première requête soit issu d'un requêtage effectué par Criteria puisse poser un problème ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    Si ça peut aider, voici les nouveaux mapping que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <union-subclass name="AntivirusFirewall" table="av_fw">
     
    	<property column="numdossier" name="numdossier" not-null="true" type="string" />
     
    	<many-to-one name="Installation" cascade="all" fetch="join" class="AntivirusFirewallInstallation" column="iduser" lazy="false" unique="true" insert="false" update="false" />
     
    </union-subclass>
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <class name="AntivirusFirewallInstallation" table="av_fw_installation">
     
    	<id column="cle" name="Cle" type="string">
    		<generator class="foreign">
    			<param name="property">AntivirusFireWall</param>
    		</generator>
    	</id>
     
    	<property column="datecreat" name="Date" type="date" />
     
    	<one-to-one name="AntivirusFirewall" class="AntivirusFirewall" />
     
    </class>

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Comment sont structurées tes tables de BD ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    A l'arrache me paraît une bonne réponse, mais je ne pense que c'est celle que tu désire.

    Voici pour la table av_fw :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PK     iduser         varchar(30)
    Et pour la table av_fw_installation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           cle            varchar(24)     (tiens, pas normal ça...)
    Je n'ai mis que ce qui importait (c'est un projet professionnel que je reprends, et je n'ai pas l'autorisation de tout mettre, désolé). Le champ "cle" est censé être la clé primaire de "av_fw_installation", mais n'est pas défini comme tel dans la base de données. Les valeurs de ce champ sont les mêmes que les valeurs du champ "iduser" de la table "av_fw".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  2. Réponses: 6
    Dernier message: 17/03/2011, 23h27
  3. Réponses: 2
    Dernier message: 10/08/2007, 11h46
  4. requete hql sur association one to many avec inner class
    Par austin P. dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/06/2007, 11h56
  5. One to many sur un Id composé
    Par F2S dans le forum Hibernate
    Réponses: 8
    Dernier message: 11/05/2007, 16h26

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