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 :

Ma clé primaire est un objet


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut Ma clé primaire est un objet
    Bonjour,

    Je dois faire une requête sur une table qui a une clé primaire composée :
    - la première partie de la clé est un objet (Procedure). La clé de cet objet est elle même composée
    - la seconde est un entier

    Mais quand je fais une simple requête ca me génère l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    org.hibernate.QueryException: Expected positional parameter count: 2, actual parameters: [bean.Procedure@bea, 43] [
    		from Mail
    		where procedure = ?
    			and codeMail = ?
    Pour exécuter ma requête je fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           Query q = s.getNamedQuery("mail.par.code");
    	q.setParameter(0,p);
    	q.setInteger(1,codeMail);
    	m = (Mail)q.uniqueResult();
    je ne suis pas sûre de pouvoir passer en paramètre de ma requête un objet, mais je ne vois pas d'autre solution vu mon mapping !

    Comment pourrais-je faire ?

  2. #2
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Tu ne peux pas essayer de passer directement par les clés plutot que par l'objet procédure ?

    Je ne garantis pas que ce que tu fais actuellement fonctionne ... cependant il est aussi possible de faire ce que tu veux avec l'API criteria.

    Il est alors possible d'ajouter les Example dans lequel tu pourras dès lors passer ton objet Procédure en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria crit = session.createCriteria(Mail.class)
                        .add(Restrictions.eq("codeMail",varCodeMail))
                        .createCriteria(Procedure.class)
                             .add(Example.create(p));
    crit.uniqueResult();

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Salut,

    Je comprends pas très bien la requête que tu veux que je fasse, je suppose que tu ne veux créer qu'une requête,alors pourquoi rajouter la ligne "createCriteria(Procedure.class)" ?

  4. #4
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Via l'API Criteria, cet appel effectue une "jointure" d'objet... note la nuance avec l'autre "createCriteria(Class)" ... le premier est une méthode de Session alors que le second est une méthode de Criteria ... leur utilité est différente. Je sais, c'est plutot ambigu mais ca fonctionne ainsi

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    J'ai modifié légèrement ton script comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria crit = s.createCriteria(Mail.class);
    	    crit.add(Restrictions.eq("codeMail",String.valueOf(codeMail)));
                crit.createCriteria("procedure");
                crit.add(Example.create(p));
                m = (Mail)crit.uniqueResult();
    C'était ca ton idée ?

  6. #6
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Ah ui pardon, c'est bien ainsi, je me suis trompé dans la signature toutes mes excuses

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Car "monCriteria.CreateCriteria(Class)" ne fais pas parti de la liste des méthodes, seul "monCriteria.CreateCriteria(String)" existe

  8. #8
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    C'est pas grave, tu es déjà bien sympa de m'aider

    Alors j'ai testé, j'ai l'impression que la méthode est bonne, mais il me fait un CastClassException un peu bizarre puisqu'il me met monPackage.maClasse.$$EnhancerByCGLIB$$56fc9662 ???

  9. #9
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Il y a de l'heritage dans les objets que tu utilises ?!?
    Hibernate duplique certains objets lors du chargement en utilisant la librairie CGlib ... l'erreur vient elle de l'objet Procedure ?!? Mail ?!?

  10. #10
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Non pas d'héritage.

    Mon erreur exacte est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.ClassCastException: bean.Procedure$$EnhancerByCGLIB$$56fc9662

  11. #11
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Comment charges-tu ton objet procédure au préalable ?!? Est-il issue d'une association ou bien est-ce un chargement direct ?!? Est-ce en lazy ou non ?!?

  12. #12
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Voici un extrait de mon fichier de mapping Procedure :

    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
     
    <class name="bean.Procedure" schema="monSchema" table="PROCEDURE">	
    		<composite-id>
    			<key-property column="FILIERE_CODE" length="18" name="codeFiliere" type="int"/>
    			<key-property column="PROCEDURE_CODE" length="18" name="codeProc" type="int"/>
    		</composite-id>
     
    		....
     
    		<set name="listeMail" lazy="true" inverse="true" cascade="save-update">
    			<key>
    				<column name="FILIERE_ID" />
    				<column name="PROC_ID"/>
    			</key>
    			<one-to-many class="bean.Mail"/>
    		</set>
    	</class>
    Extrait de mon fichier de mapping de Mail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <class name="bean.Mail" schema="monSchema" table="MAIL">
    		<composite-id>
    			<key-many-to-one name="procedure" class="bean.Procedure">
    	        	<column name="FILIERE_ID"/>
    	        	<column name="PROC_ID"/>
            	</key-many-to-one>
    			<key-property column="MAIL_ID" length="18" name="codeMail" type="int"/>
    		</composite-id>
     
    		<property column="MAILADDRESSES" length="500" name="adresse" not-null="true" type="string"/>
    	</class>
    Et ma requête c'est celle que je tu ma donner avec le criteria

  13. #13
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    J'ai pas l'impression que quelque chose soit faux dans ton mapping par contre pourrai-je voir la méthode où tu appelles criteria (et notamment le moment ou tu charges la procédure avant ... enfin, si c'est possible hein , jvoudrai pas que ton responsable (RK si je ne m'abuse ) pense que tu divulgues trop d'infos sur le net

  14. #14
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Ben j'ai une méthode classique qui ouvre ma session hibernate, j'effectue la requête que m'a donné, je ferme mon session et je renvoie mon objet peuplé (normalement ). Rien de très original.

    Au moment de l'appel, l'objet Procedure que je passe en paramètre est récupéré d'une précédente requête qui me renvoie d'un tableau objets et dont la première case est un objet de type Procédure (c'est pour ca que j'ai une copie, donc le ...$$EnhancerByCGLIB$$73a3dbb)

    Mais je suis sûre que mon objet Procédure est bien peuplé car j'utilise ses méthodes et ca m'affiche les bons résultats !

  15. #15
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Oui oui, je confirme que l'objet sera bon mais cet objet la est utilisé (je crois) par le proxy ... en tout cas, j'avais eu ce probleme pour un héritage et j'ai du charger l'objet directement pour éviter cette instanciation temporaire avec EnhancerByCGLib ... peut etre devrais tu essayer de le transformer par un autre moyen (un refresh ou autre sur l'objet en question...)

  16. #16
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Qu'entends tu par "charger directement l'objet" ?

  17. #17
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Citation Envoyé par Galak extra
    Qu'entends tu par "charger directement l'objet" ?
    lazy=false >> ne pas charger tardivement >> charger directement.
    Désolé, j'avais pas d'autre expression sous le bras

  18. #18
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Ah ok !

    Mais je ne crois que cela va changer quelque chose car étant donné que ma Procedure est une partie de la clé primaire il faut bien que je la passe en paramètre sinon je ne sais pas quel mail chargé !

  19. #19
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Effectivement j'ai mis lazy = false dans le mapping de mes mails et je n'ai plus de copie d'objet, en revanche, j'ai toujours mon ClassCastException ! mais cette fois ci avec un objet Procedure tout court

  20. #20
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Ah, il s'attendait a avoir quoi au départ ?!? On peut avoir la trace de l'erreur par hasard ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/08/2007, 10h28
  2. Réponses: 3
    Dernier message: 15/02/2007, 12h02
  3. [Clés primaires] Est ce possible de les modifier ?
    Par dynexd dans le forum Access
    Réponses: 3
    Dernier message: 29/09/2006, 14h03
  4. Réponses: 1
    Dernier message: 14/04/2006, 21h46
  5. [c#] Quel est cet objet ?
    Par SDuh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/02/2006, 13h27

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