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 :

Problème assez particulier avec Set


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Problème assez particulier avec Set
    Bonjour à tous ! Voila je post ici parce que j'ai eu beau chercher, je n'ai toujours pas trouvé de solution.

    Voila le contexte : imaginez un annuaire des anciens étudiants. Il comporte des Promotions, qui elles-mêmes contiennent des Etudiants.

    Donc je créé les fichiers de mapping via le plugin HibernateSynchronizer d'Eclipse :

    fichier TPromotions.hbm.xml qui représente une promotion :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <hibernate-mapping package="ultimate.beans">
    	<class
    		name="Promotion"
    		table="TPromotions"
    	>
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="id"
    			type="integer"
    			column="id"
    		>
    			<generator class="native"/>
    		</id>
     
    		<property
    			name="titre"
    			column="titre"
    			type="string"
    			not-null="true"
    			length="255"
    		/>
    		<property
    			name="description"
    			column="description"
    			type="string"
    			not-null="false"
    		/>
    		<property
    			name="annee"
    			column="annee"
    			type="integer"
    			not-null="true"
    			length="11"
    		/>
    		<property
    			name="specialite"
    			column="specialite"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<property
    			name="options"
    			column="options"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<property
    			name="location"
    			column="location"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<set name="etudiants" inverse="true" lazy="false">
    			<key column="id"/>
    			<one-to-many class="Etudiant"/>
    		</set>
    	</class>
    fichier TEtudiants.hbm.xml qui représente un étudiant :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <hibernate-mapping package="ultimate.beans">
    	<class
    		name="Etudiant"
    		table="TEtudiants"
    	>
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="id"
    			type="integer"
    			column="id"
    		>
    			<generator class="native"/>
    		</id>
     
    		<property
    			name="nom"
    			column="nom"
    			type="string"
    			not-null="true"
    			length="255"
    		/>
    		<property
    			name="prenom"
    			column="prenom"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<property
    			name="mail"
    			column="mail"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<property
    			name="dateNaissance"
    			column="dateNaissance"
    			type="date"
    			not-null="false"
    			length="10"
    		/>
    		<property
    			name="societe"
    			column="societe"
    			type="string"
    			not-null="false"
    			length="255"
    		/>
    		<property
    			name="societeWeb"
    			column="societeWeb"
    			type="string"
    			not-null="false"
    		/>
    		<property
    			name="web"
    			column="web"
    			type="string"
    			not-null="false"
    		/>
    		<property
    			name="dateMAJ"
    			column="dateMAJ"
    			type="date"
    			not-null="false"
    			length="10"
    		/>
    		<many-to-one
    			name="promotion"
    			column="promotion"
    			class="Promotion"
    			not-null="true"
    		>
    		</many-to-one>
    	</class>	
    </hibernate-mapping>
    création des tables SQL :
    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
    26
    CREATE TABLE `TEtudiants` (
      `nom` varchar(255) NOT NULL,
      `prenom` varchar(255) default NULL,
      `mail` varchar(255) default NULL,
      `promotion` int(11) NOT NULL,
      `dateNaissance` date default NULL,
      `id` int(11) NOT NULL auto_increment,
      `societe` varchar(255) default NULL,
      `societeWeb` text,
      `web` text,
      `dateMAJ` date default NULL,
      PRIMARY KEY  (`id`),
      KEY `fk_promo` (`promotion`),
      CONSTRAINT `fk_promo` FOREIGN KEY (`promotion`) REFERENCES `TPromotions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1
     
    CREATE TABLE `TPromotions` (
      `id` int(11) NOT NULL auto_increment,
      `titre` varchar(255) NOT NULL,
      `description` text,
      `annee` int(11) NOT NULL default '1970',
      `specialite` varchar(255) default NULL,
      `options` varchar(255) default NULL,
      `location` varchar(255) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1
    Le problème :

    Il est très particulier. Lors du listage des promotions (qui sont en Lazy=false), le seul étudiant à se charger dans le Set de la promotion est l'étudiant qui a le même ID que la promotion.

    Exemple :

    Imaginons que j'ai un Etudiant ALAIN d'identifiant 2 et un étudiant ALEX d'identifiant 3, tout deux faisant partie de la promotion d'identifiant 3, lors du chargement de la promotion 3, seul ALEX (id=3) se chargera dans le Set.

    Avez-vous déjà vu ce problème ? Avez vous une solution ?
    Pensez-vous que cela vienne du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="etudiants" inverse="true" lazy="false">
    			<key column="id"/>
    			<one-to-many class="Etudiant"/>
    		</set>
    sachant que ET les promotions ET les étudiants ont pour clé primaire une colonne de même nom ?

    Je suis perdu . Merci d'avance de votre aide

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    bonjour

    dans le mapping de la classes etudiants la relation <one-to-many doit avoir comme column l'id de la class promotion

    le column doit referencer ton id comme sur ta base de données

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    <many-to-one
    name="promotion"
    column="id"
    class="Promotion"
    not-null="true"
    >
    </many-to-one>


    ca doit etre ca

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bah bizarrement, ça ne m'étonne pas, mais ça ne marche pas.

    En effet, si je fais un <many-to-one et que dans le nom de colonne je donne "id", il pense que je défini 2 fois la propriété id, une fois en tant qu'id de l'utilisateur, et une fois en tant qu'id de promotion ..

    MAIS !

    Tu m'as donné une idée qui m'a donné la solution ! Voila, ce qui clochait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="etudiants" inverse="false" lazy="false">
    			<key column="id"/>
    			<one-to-many class="Etudiant"/>
    		</set>
    Je pensais que cela signifiait qu'il ferait un set d'objets Etudiant dont la clé est ID (Etudiant.setId() ...). En fait il fallait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="etudiants" inverse="false" lazy="false">
    			<key column="promotion"/>
    			<one-to-many class="Etudiant"/>
    		</set>
    Ce qui veut dire que le Set d'étudiant sera rempli d'étudiant dont la clé de cette promotion se trouve dans la colonne "promotion" !

    Merci à vous, et je sais pas si a aidera d'autres personnes !

Discussions similaires

  1. Problème avec Set compliance level
    Par bassem-ca dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 19/02/2009, 21h17
  2. [E-03] Problème avec Set de worksheet
    Par drakkar_agfa dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/12/2008, 21h44
  3. [E-00] problème avec set
    Par anyah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/11/2008, 14h07
  4. [RegEx] Problème assez étrange avec un preg_match
    Par lysandre dans le forum Langage
    Réponses: 3
    Dernier message: 28/05/2008, 00h14
  5. Problème pour charger un set avec une clé étrangère
    Par sylvainv18 dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/11/2006, 18h08

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