-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 17 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: [hibernate3] mapping, clé composée, clé etrangère
PostPosted: Tue Aug 09, 2005 6:03 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version: hibernate3

Bonjour

voilà j'ai qqs soucis avec le mapping d'une de mes classes dont la clé primaire est composée et contient une clé étrangère. En bref, j'ai 2 tables :
Personne ( id_person, lastname, firstname )
Contact ( contact_type, id_person, tel, mail )

et voici mon mapping des 2 tables :

Code:

<class name="ClassPersonne" table="PERSON">
        <id name="personId" column="ID_PERSON">
          <generator class="assigned"/>
        </id>
        <property name="lastName" type="string" column="LASTNAME"/>
        <property name="firstName" type="string" column="FIRSTNAME"/>
        <bag name="contacts" lazy="true">
    <key column="ID_PERSON"/>
   <one-to-many class="ClassContact" />
        </bag>
    </class>

    <class name="ClassContact" table="CONTACT">
        <composite-id>
           <key-property  name="contactType" type="character" column="CONTACT_TYPE" />           
           <key-many-to-one name="personId"  class="ClassPerson" column="ID_PERSON" />
        </composite-id>
         <property name="tel" type="string" column="TEL"/>
        <property name="mail" type="string" column="MAIL"/>
   </class>


et j'ai cette erreur :
Code:
Hibernate: insert into PERSON (LASTNAME, FIRSTNAME, ID_PERSON) values (?, ?, ?)
Hibernate: update CONTACT set ID_PERSON=? where CONTACT_TYPE=? and ID_PERSON=?
9 août 2005 11:58:10 org.hibernate.property.BasicPropertyAccessor$BasicGetter get
GRAVE: IllegalArgumentException in class: ClassPerson, getter method of property: personId


mes questions :
1)pourquoi fait-il une mise à jour de la table contact au lieu d'un ajout ?
2) pourquoi ça ne marche pas ?

quelqu'un a-t-il une idée ?

Merci d'avance


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 7:11 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Ton mapping de la classe personne ne semble pas complet. On ne voit pas comment est définit ton asso dans le sens personne->contact.

Il faudrait ausi le bout de code qui crée la personne et le contact. Quelle instance sauves tu. Si c'est la personne, quel est le mode de cascade.

Essaie aussi d'inverser dans ton composite-id les deux lignes key-property/key-many-to-one, je crois me rappeler que j'avais eu des pbs à cause de l'ordre une fois.

Seb


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 8:29 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
scesbron wrote:
Ton mapping de la classe personne ne semble pas complet. On ne voit pas comment est définit ton asso dans le sens personne->contact.


1 personne peut avoir 0 à n types de contact. C'est pour ça que j'ai mis :

<bag name="contacts" lazy="true" >
<key column="ID_PERSON"/>
<one-to-many class="ClassContact" />
</bag>

à moins que cela ne permette pas de définir la relation côté "Personne"... ?

scesbron wrote:
Il faudrait ausi le bout de code qui crée la personne et le contact. Quelle instance sauves tu. Si c'est la personne, quel est le mode de cascade.


euh... je voudrais créer les 2 instances. Je crée une nouvelle personne et lui affecte directement une "liste" de contacts. qd je met cascade="all", j'ai cette erreur :
Code:
9 août 2005 14:26:16 org.hibernate.property.BasicPropertyAccessor$BasicGetter get
GRAVE: IllegalArgumentException in class: ClassPerson, getter method of property: personId



scesbron wrote:
Essaie aussi d'inverser dans ton composite-id les deux lignes key-property/key-many-to-one, je crois me rappeler que j'avais eu des pbs à cause de l'ordre une fois.

j'ai essayé, mais ça ne change rien...

je continue de chercher et je ferai part de mon avancement...
Seb Merci de ton aide !


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 8:31 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Ca y est j'y suis,

Dans ton bag tu dois mettre tes deux colonnes comme clé dans le même ordre que pour le composite-id de contact


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 8:37 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
on peut mettre 2 clés dans un bag ??...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 8:48 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
en tous cas dan un set ça marche
Code:
        <key>
            <column name="NUM_CONF_TERM" />
            <column name="NUMERO_PUL" />
        </key>


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 8:53 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
j'ai essayé avec un set et les 2 colonnes en clé et j'ai cette erreur :

Code:
INFO: processing foreign key constraints
org.hibernate.MappingException: Foreign key (FKB24D8CEB84E0D87E:CONTACT [CONTACT_TYPE,ID_PERSON])) must have same number of columns as the referenced primary key (PERSON [ID_PERSON])


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 9:13 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Autant pour moi, j'ai répondu un peu vite, dans mon cas c'était la classe référencée par le set qui avait un id composite.

Par contre en regardant tes fichiers à nouveau j'ai une quesion : le fait que tu es une classe "Personne" et un lien vers "Person" c'est une coquille de recopie. Sinon ton problème peut venir de là

Seb

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 9:20 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
non non, en fait les erreurs que tu peux voir sur ce topics viennent du fait que j'ai modifié quelque peu les noms pour simplifier le pb...

en gros, j'ai 2 tables : PERSON et CONTACT
et 2 classes : ClassPerson et ClassContact

ici, je viens de modifier un petit qqch :

Code:
<set name="contacts" lazy="true" cascade="all"> 
   <key>       
    <column name="ID_PERSON" />
    </key>
   <one-to-many class="ClassContact"/>
</set>


et l'erreur produite est : "Null" !... apparemment ça lève une ClassCastException


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 9:32 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
je vais préciser qqs petites choses...

dans ClassPerson :

Code:
private int personId;   
private String firstName;
private String lastName;
private Collection contacts = new ArrayList();
   
public String getFirstName() {return firstName;}
public void setFirstName(String firstName) {   this.firstName = firstName;}
public String getLastName() {return lastName;}
public void setLastName(String lastName) {   this.lastName = lastName;}
public int getPersonId() {return personId;}
public void setPersonId(int personId) {this.personId = personId;}
public Collection getContacts() {return contacts;}
public void setContacts(Collection contacts) {this.contacts = contacts;}


et dans ClassContact :
Code:
private char contactType;
private int personId;
private String tel;   
private String mail;

... et getter/setter


la 1ere erreur que j'ai eu (voir 1er message) c'etait un rapport avec un getter pour personId... ai-je oublié qqch dans ma classe ??

dans le cas de mon post avant celui-ci, j'ai une erreur "Null"... serait-elle dû à ma manière d'ajouter en base ?
voilà mon main de test
Code:
 
ClassContact cont = new ClassContact();
   cont.setContactType('1');
   cont.setEmail("truc@machin.fr");
   cont.setPhone("0123456789");
   cont.setPersonUid(4);
           
ClassPerson pers =  new ClassPerson();
    pers.setPersonUid(4);
    pers.setFirstName("toto");
    pers.setLastName("titi");
    Collection c = new ArrayList();
    c.add(cont);
    pers.setContacts(c);

session.save(pers);


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 9:42 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
scesbron wrote:
Autant pour moi, j'ai répondu un peu vite, dans mon cas c'était la classe référencée par le set qui avait un id composite.

Par contre en regardant tes fichiers à nouveau j'ai une quesion : le fait que tu es une classe "Personne" et un lien vers "Person" c'est une coquille de recopie. Sinon ton problème peut venir de là

Seb


Mais dans mon cas aussi c'est la classe référencée par le set qui a un id composite (la class ClassContact), à moins que je sois complétement à côté.... ce qui est possible aussi !...

dans tous les cas, ça ne marche pas


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 11:21 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Vu ton mapping tu ne devrais pas pouvoir faire
Code:
cont.setPersonUID(4);


mais tu devrais faire
Code:
cont.setPerson(maPersonneDUID4);

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 11:37 am 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
euh... je ne comprend pas le "maPersonneDUID4"...

A la limite je devrais faire :
Code:
cont.setPersonId(pers.getPersonId());


mais ça ne change rien... j'ai essayé d'utiliser le plugin d'eclipse Synchronizer Hibernate pour hibernate3... mais apparemment ça ne marche pas super... De plus, les fichiers de mapping qu'il me génère par rapport aux tables utilisent <set> exactement de la même manière que moi maintenant... mais rien. Je pense que l'erreur vient du main... mais où exactement ?...

en tout cas, merci pour ton aide


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 11:58 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Non,

Au vu de ton mapping (key-many-to-one) la classe Contact doit avoir une référence vers une instance de la classe Personne mais pas vers un id de personne.

Si tu veux que ta classe Contact possède juste l'id de Personne sans connaitre l'instance il faut utiliser key-property

seb

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 12:07 pm 
Newbie

Joined: Tue Aug 09, 2005 5:47 am
Posts: 10
euh... oui. Un contact n'existe que s'il y a un enregistrement dans la table personne. Donc c'est plus que le simple ID qu'il faut mais l'instance en elle même... (c'est bien ça que tu voulais dire ?)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 17 posts ]  Go to page 1, 2  Next

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.