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 :

[Debutant]Mapping pour une collection


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut [Debutant]Mapping pour une collection
    Bonjour,

    je me suis lancé ds Hibernate, ...

    J'adopte une demarche sensiblement différente des démarches "courantes" car en fait j'ai developpé un projet avec une persistence en XML et je veux passer a une persistence hibernate ... J'ai donc des objets java a "mapper" vers de la base oracle et non l'inverse comme c'est souvent le cas !

    Mon problème en fait doit être assez simple pour les gens habitués ...

    J'ai une classe MaClasse qui possède 3 attributs :

    Id : un string qui me sert d'identifiant.
    Att1 : un String pour de l'information.
    AttCollection : une collection d'instances de MaClasse2.

    Comment dois-je écrire le fichier de mapping hbm.xml ?

    Pour l'instance j'ai un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <hibernate-mapping package="com.sopragroup.appmanager.model">
      <class name="MaClasse">
    	<id name="Id" column="MACLASSE_ID">
    	      <generator class="uuid" />
                 </id>
    	<property name="att1" column="MACLASSE_ATT1"></property>
    	<set name="att2" cascade="save-update" inverse="true">
    	 <key column="COLONNE_2" />
    	 <one-to-many class="le.package.MaClasse2" />
    	</set>
       </class>
    </hibernate-mapping>
    je crois que je me suis perdu en route ... je suis perdu ...

    Merci d'avance a ceux qui prendront 1 minute pour moi !

  2. #2
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut
    Salut,

    Il manque un attibut type pour ton élément property, sinon le reste me semble correct.

    Au plaisir.

  3. #3
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Tout pareil

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    En fait je ne sais pas comment je dois stocker cette collection ...

    Je dois avoir une table entre les deux ??? qui stock des couples idMaclasse1 / IdMaclasse2 ... ou alors c'est dans la table MACLASSE2 que j'aurais autant de lignes que d'elements dans ma collection java et cette table aurait un champ MaClasse1_ID ???

    Je crois que je ne suis pas clair

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    Voila ce qu'il me met !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of mon.package.MaClasse1.attCollection
    ... le mechant !

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ben il faut que tu réfléchisse si c'est une relation 1-n ou n-m ... Une instance de classe 2 est rattachée à un seul objet de classe 1 ou pas ?
    Si oui, alors c'est ta deuxième solution, sauf que ta colonne en base s'appelle "MACLASSE_ATT1" d'après ton fichier de mapping

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    Une chose est sure c'est : "une instance de classe2 n'est rattachée qu'a une seule instance de maClasse1 " !!!

  8. #8
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ben montre le "setter of mon.package.MaClasse1.attCollection" ...

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public void setAttCollection(MaClasse2[] values) {
    		this.attCollection = values;
    	}

  10. #10
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    Vu ton fichier de mapping, tu devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public void setAtt2(Set values) {
    		this.att2 = values;
    	}
    ?

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    Bien vu !

    mais là tu souleves un pb extreme ... je ne peux pas changer le type de mon attribut java ...

    J'ai tenté de mettre un setter qui prend un set en argument mais ca marche pas, il met tjs la meme erreur !

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut Bon, voyons un cas simple !!!
    Je fais un exemple simple pour me fixer les idées et meme ca ca marche pas !!!



    Exemple :

    J'ai une table equipe : TEAM (un nom d'equipe comme simple attribut)
    J'ai une table joueur : PLAYER (un id, un nom et une clef etrangere vers equipe)

    Je fais ca :

    Team.hbm.xml :

    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="le.package">
      <class name="Team" table="TEAM">
      		<id name="name" column="TEAM_NAME">
    			<generator class="uuid" />
    		</id>
    		<set name="players" cascade="save-update" inverse="true">
    			<key column="PLAYER_ID" />
    			<one-to-many class="le.package.Player" />
    		</set>
      </class>
    </hibernate-mapping>
    Player.hbm.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.sopragroup.appmanager.model">
      <class name="Player">
      		<id name="id" column="PLAYER_ID">
    			<generator class="uuid" />
    		</id>
    		<property name="name" column="PLAYER_NAME"></property>
    		<many-to-one column="TEAM_NAME" name="team" class="Team"/>
      </class>
    </hibernate-mapping>
    ensuite quand je veux m'en servir ca marche pas !!! je fais ca :

    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
    23
    24
    25
    			Session session = HibernateUtil.currentSession();
    			Transaction tx = session.beginTransaction();
     
    			Set s = new HashSet();
     
    			Player p1 = new Player();
    			p1.setName("pn1");
    			p1.setId("1");
     
    			Player p2 = new Player();
    			p2.setName("pn2");
    			p2.setId("2");
     
    			s.add(p1);
    			s.add(p2);
     
    			Team t = new Team();
    			t.setName("nomdequipe");
    			t.setPlayers(s);
     
     
    			session.save(t);
    			session.save(p1);
    			session.save(p2);
    			tx.commit();
    Ca créé la team mais pas les players ...

    Qu'est ce que j'ai fais de mal ... ???

  13. #13
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    Tu peux essayer ça :
    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
    Session session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();
     
    Team t = new Team();
    t.setName("nomdequipe");		
    session.save(t);
     
    Player p1 = new Player();
    p1.setName("pn1");
    p1.setId("1");
    p1.setTeam(t);
     
    Player p2 = new Player();
    p2.setName("pn2");
    p2.setId("2");
    p2.setTeam(t);
     
    session.save(p1);
    session.save(p2);
    tx.commit();

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    frustrant !

    Je crois que je vais laisser tomber

  15. #15
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    C'est surtout un problème de SGBD !

    Comment gères tu tes clés primaires ?
    Par assignation, génération, auto-increment ?

    EDIT : Oups, j'avais pas vu tes fichiers hbm !

    Il ne te dit pas quel contrainte il viole ?

    Je crois que j'ai trouvé :

    Dans team.hbm :
    <set name="players" cascade="save-update" inverse="true">
    <key column="TEAM_NAME" />
    <one-to-many class="le.package.Player" />
    </set>

Discussions similaires

  1. [Hibernate] mapping d'une collection
    Par Jorus dans le forum Hibernate
    Réponses: 22
    Dernier message: 01/12/2008, 17h16
  2. Réponses: 8
    Dernier message: 27/08/2008, 18h36
  3. Deux mappings pour une seule et même classe
    Par myocean dans le forum Hibernate
    Réponses: 3
    Dernier message: 18/04/2008, 16h43
  4. Erreur MySQL suite au mapping d'une collection
    Par K-Kaï dans le forum Hibernate
    Réponses: 8
    Dernier message: 08/06/2007, 15h48
  5. DEBUTANT - Aide pour une requête MYSQL
    Par kryogen dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/03/2007, 14h30

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