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 :

composite-id et colonnes nulles


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut composite-id et colonnes nulles
    Bonjour,

    J'ai un petit problème avec une clé composite.
    Il s'avère que une des colonnes de ma clé composite peût être nulle.
    Dans ce cas le problème est le suivant :
    - Lorsque une requête renvoi une ligne de la table correspondant à ma clé composite et que cette ligne contient une colonne de la clé à null, alors la valeur de l'objet récupérer vaut null.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select pl
    from 
    	ProjectLead pl				
    where
    	pl.deal.clientByClicode = 'IBM'			and
    	pl.deal.year = 2008 and
    	pl.country = null
    ProjectLead est en fait une table constitué uniquement de clés étrangères. En fait ProjectLead représente l'association entre un deal, une personne physique est une country et est à elle seule une clé composite.
    Le fait est que la référence sur la country peut être nulle.
    Lorsque c'est le cas, la requête renvoi null.

    Merci d'avance pour votre aide et surtout n'hésitez pas à me questionner si je ne suis pas trés clair.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 856
    Points
    1 856
    Par défaut
    Mes souvenirs sont flous, mais si Hibernate est comme SQL, alors pour tester une valeur à null on emploie pas mais une fonction du type is_null ou isnull ou quelque chose comme ça.

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par BugFactory
    Mes souvenirs sont flous, mais si Hibernate est comme SQL, alors pour tester une valeur à null on emploie pas mais une fonction du type is_null ou isnull ou quelque chose comme ça.
    Merci pour ta réponse, mais ce n'est pas ce que je demandais, pour ton information voici le code que génère hibernate pour la requête précédente :
    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
     
    select
      projectlea0_.DEANUMBER as DEANUMBER22_,
      projectlea0_.PHPNUMBER as PHPNUMBER22_,
      projectlea0_.CNTNUMBER as CNTNUMBER22_ 
     from
      dbo.PJL projectlea0_,
      dbo.DEA deal1_ 
     where
      projectlea0_.DEANUMBER=deal1_.DEANUMBER 
      and deal1_.CLICODE='IBM' 
      and deal1_.DEAYEAR=2008 
      and (
       projectlea0_.CNTNUMBER is null
      )
    Deplus en HQL écrire valeur = null est la forme correcte.
    Comme tu peux le constater le code générer est correct, hibernate transforme bien
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    projectlea0_.CNTNUMBER is null

  4. #4
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Je ne comprends pas le concept de cle composite egal a null???

    C'est un non-sens. Ou alors tu parles d'une cle etrangere et dans ce cas il ne s'agit pas de composite-id...

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par willoi
    Je ne comprends pas le concept de cle composite egal a null???

    C'est un non-sens. Ou alors tu parles d'une cle etrangere et dans ce cas il ne s'agit pas de composite-id...
    Merci pour ta réponse.
    Je me suis certainement mal exprimé.
    Il s'agît d'une clé composite (composite-id) constitué de trois clé étrangère. Cette clé composite est de la forme :
    (a1,b1,c1).
    Le fait est que dans la base que je traite cette clé peux prendre la forme suivante :
    (0,1,1)
    (1,2,0)
    mais aussi : (0,1,null) et c'est ce dernier cas qui pose problème. Lorsque la clé composite contient une des trois valeurs à null alors le résultat de la requête précédente vaut null.

    Me suis je fait comprendre.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 856
    Points
    1 856
    Par défaut
    Mmm... Quelle est la réponse de la base de données quand on fait passer cette requête à la main?
    La jointure est-elle utile?

  7. #7
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par BugFactory
    Mmm... Quelle est la réponse de la base de données quand on fait passer cette requête à la main?
    La jointure est-elle utile?
    Merci, mais cette question est hors discussion.

  8. #8
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par mitje
    Merci, mais cette question est hors discussion.
    mais si au contraire ca me parait interessant si cette requete te renvoie des donnees ou non.

  9. #9
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    il me semble que ce problème a été soumis ici :

    http://forum.hibernate.org/viewtopic...iteid+nullable

    si hibernate ne supporte pas en standard, c'est surement parceque bcp de sgbd ne supportent pas les clés composites avec valeur nulles...

    sinon pour faire avancer le problème et éventuellement tester chez nous :
    -sgbd utilisé ?
    -version d'hibernate ?
    -extrait du mapping utilisé ?
    -script ddl de ta table concernée ?

  10. #10
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par willoi
    mais si au contraire ca me parait interessant si cette requete te renvoie des donnees ou non.
    Cette requête me renvoi null et c'est la seule chose que nous avons besoin de savoir.

  11. #11
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Grégory Picavet
    il me semble que ce problème a été soumis ici :

    http://forum.hibernate.org/viewtopic...iteid+nullable

    si hibernate ne supporte pas en standard, c'est surement parceque bcp de sgbd ne supportent pas les clés composites avec valeur nulles...

    sinon pour faire avancer le problème et éventuellement tester chez nous :
    -sgbd utilisé ?
    -version d'hibernate ?
    -extrait du mapping utilisé ?
    -script ddl de ta table concernée ?
    Merci, le lien que tu m'as donné est franchement intéressant. je vais creuser de ce côté la.

    SGBD : Sybase 12.5
    Hibernate 3.2
    Mapping :
    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
    <class name="model.ProjectLead" table="PJL" >
            <composite-id name="id" class="model.ProjectLeadId">
                <key-property name="deal" type="int">
                    <column name="DEANUMBER" precision="9" scale="0" />
                </key-property>
                <key-property name="physicalPerson" type="int">
                    <column name="PHPNUMBER" precision="9" scale="0" />
                </key-property>
                <key-property name="country" type="java.lang.Integer" >
                    <column name="CNTNUMBER" precision="9" scale="0"/>
                </key-property>
            </composite-id>
            <many-to-one name="physicalPerson" class="model.PhysicalPerson" update="false" insert="false" fetch="select">
                <column name="PHPNUMBER" precision="9" scale="0" not-null="true" />
            </many-to-one>
            <many-to-one name="country" class="model.Country" update="false" insert="false" fetch="select">
                <column name="CNTNUMBER" precision="9" scale="0" not-null="true"/>
            </many-to-one>
            <many-to-one name="deal" class="model.Deal" update="false" insert="false" fetch="select">
                <column name="DEANUMBER" precision="9" scale="0" not-null="true" />
            </many-to-one>
        </class>
    Le mapping te donnes toute la structure de la table. Malheureusement, je n'ai pas le script de creation des tables. Les mappings ont étaient générés par reverse avec hibernate tools.

    Merci encore.

  12. #12
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    Cette requête me renvoi null et c'est la seule chose que nous avons besoin de savoir.
    je pense qu'a ce stade on n'était pas sur que le problème provienne d'hibernate (meme si maintenant il y a de fortes présomptions). Si la requête sql générée par hibernate renvoie le résultat attendu alors que ca retourne null dans le code appelant, alors le problème se situe effectivement au niveau de la translation resultset jdbc -> objet persistant. Ca peut être un pbl dans le mapping ou la gestion de l'objet en session. Normalement tu as du redéfinir les méthodes equals et hashcode dans ta classe ProjectLeadId, non?gères-tu correctement le cas nul?

  13. #13
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par mitje
    Cette requête me renvoi null et c'est la seule chose que nous avons besoin de savoir.
    Tres bien, comme tu veux .Dorenavant, j'essaierais d'oublier de t'aider puisque tu pense avoir trouvé quelle est la meilleure methode pour solutionner ton probleme.

  14. #14
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par willoi
    Tres bien, comme tu veux .Dorenavant, j'essaierais d'oublier de t'aider puisque tu pense avoir trouvé quelle est la meilleure methode pour solutionner ton probleme.
    Le prend pas mal willoi. J'essais pour ma part de t'éviter de perdre ton temps sur une voie de garage.

  15. #15
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Grégory Picavet
    je pense qu'a ce stade on n'était pas sur que le problème provienne d'hibernate (meme si maintenant il y a de fortes présomptions). Si la requête sql générée par hibernate renvoie le résultat attendu alors que ca retourne null dans le code appelant, alors le problème se situe effectivement au niveau de la translation resultset jdbc -> objet persistant. Ca peut être un pbl dans le mapping ou la gestion de l'objet en session. Normalement tu as du redéfinir les méthodes equals et hashcode dans ta classe ProjectLeadId, non?gères-tu correctement le cas nul?
    C'est sur, hibernate ne supporte pas de primary key nulle ou partielement nulle.

    http://forum.hibernate.org/viewtopic...mpositeid+null

    Et c'est pas moi qui le dit mais un membre de la team hibernate.

    Maintenant la question est :
    Est -il possible de définir son propre userType de sorte à permettre une clé primaire partielement nulle. Je continu à creuser de ce côté là.

    Merci encore pour votre aide.

  16. #16
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 110
    Points
    110
    Par défaut
    Alors,

    Comme nous l'avons vu précedemment, mapper une association ternaire à l'aide d'une entité contenant une clé composite n'est pas chose facile dans certain cas.
    Surtout dans le cas où la clé composite de l'entité peut être partielement nulle :

    (1,2,3)
    (1,2,2)
    (1,2,null)

    alors l'entité (objet) remonté par hibernate vaudra null pour la troisième ligne de l'exemple ci dessus.
    Par exemple, la requête suivante renverra null bien que la requête générée renvoie une ligne (voir plus haut pour le code de la requête générée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select pl
    from 
    	ProjectLead pl				
    where
    	pl.deal.clientByClicode = 'IBM'			and
    	pl.deal.year = 2008 and
    	pl.country = null
    Le problème est donc le suivant :
    Comment faire pour récupérer l'association (1,2,null) de façons propre en utilisant hibernate ?

    Solution :

    Dans la mesure ou la classe model.ProjectLead est une association ternaire non qualifié, il n'est pas nécessaire ni obligatoire de mappé la table PJL en utilisant une entité.
    Une solution alternative consiste à mappé cette association depuis une des entité (non nullable) de l'association ternaire en utilisant un bag.
    Voici un exemple qui part de l'entité PhysicalPerson :
    La table PJL (association ternaire) n'est pas mappé.
    Dans le mapping de la classe PhysicalPerson il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		<bag name="managedDealsByCountry" table="PJL">
    			<key column="PHPNUMBER"></key>
    			<composite-element class="model.DealCountry">
    				<many-to-one name="country" class="model.Country" column="CNTNUMBER"/>
    	            <many-to-one name="deal" class="model.Deal" column="DEANUMBER"/>
    			</composite-element>
    		</bag>
    Evidemment la classe PhysicalPerson contient une propriété managedDealsByCountry de type List. Comme vous pouvez aussi le constater, j'ai créer une classe DealCountry qui me permet de représenté l'association binaire (Deal,Country) associé à une instance donné de PhysicalPerson.
    Ainsi pour une personne donné je peux maintenant récupérer des instances de DealCountry, y compris les instances de DealCountry contenant une instance de Country valant null.
    Notez que le type d'association et ici plusieurs à plusieurs entre les éléments de l'association ternaire pris deux à deux.
    ex : many2many pour (Deal,PhysicalPerson)

    De la même manière je peux partir de l'entité deal :

    Mapping depuis l'entité Deal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            <bag name="physicalPersonByCountry" table="PJL">
    			<key column="DEANUMBER"></key>
    			<composite-element class="model.PhysicalPersonCountry">
    				<many-to-one name="country" class="model.Country" column="CNTNUMBER"/>
    	            <many-to-one name="physicalPerson" class="model.PhysicalPerson" column="PHPNUMBER"/>
    			</composite-element>
    		</bag>
    Donc pour obtenir un sémantique équivalente à celle de la requête HQL présenté ci dessus on fait :

    Soit d une instance de la classe Deal telle que d.clientByClicode = 'IBM' et d.year = 2008.
    Soit A = d.getPhysicalPersonByCountry();
    Itérer A jusqu'a trouver une country nulle et récupérer la PhysicalPerson associé.

    Voilà, j'espère avoir été clair et aussi que ce post vous sera utile.
    Si vous avez des commentaires, surtout n'hésitez pas.
    Je fermerai la discu ensuite.

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

Discussions similaires

  1. affichage des colonnes "Null" en XML
    Par Yorglaa dans le forum SQL
    Réponses: 2
    Dernier message: 07/04/2008, 17h00
  2. ADO et les colonnes NULL
    Par qi130 dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/01/2008, 14h36
  3. Vérifier si colonne nulle dans résultat requete
    Par ouiskie dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/03/2007, 07h45
  4. [2.0] Colonne nulle d'une table - Ajout de DataRow via BindingNavigator
    Par sundjata dans le forum Accès aux données
    Réponses: 5
    Dernier message: 16/11/2006, 03h23
  5. Comment faire un count de colonnes null
    Par claralavraie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2006, 14h13

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