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 dans un mapping


Sujet :

Hibernate Java

  1. #1
    T2!
    T2! est déconnecté
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 47
    Points
    47
    Par défaut Problème dans un mapping
    Bonjour,

    Mon système est sûrement mal conçu. En fait, je pars de mes classes JAVA. J'en ai déduit mes tables. Mais impossible de mapper les deux. Alors de deux choses l'une, soit mes tables ne correpondent pas à mon modèle objet, soit le mapping hibernate est faux. Voici mes classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Sportif {
    	private	int		numero	= -1;
    	private	String	nom 	= null;
    	private	int		poids	= 0;
    	private	int		taille	= 0;
    	private	int		vo_max	= 0;
    	private	int		max_hr	= 0;
    	private	int		sitting_hr	= 0;
    	private	Date	dateNaiss = null;
    	private	char	genre = 'M';
    	private	String	activite = "Moderate";
     
    	Set<Seance>	lesSeances = new HashSet<Seance>();
    La seconde classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Seance {
     
    	private	int		numero 	= -1;
    	private	String	nom 	= "Libre";
        private	Time	date 	= null;
        private	int		calories= 0;
        private	Sportif	sportif	= null;
    Bien sûr les classes contiennent tout ce qu'il faut en getter, setter, constructeurs, etc.

    Le mapping que j'ai prévu est le suivant :

    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
     
    <hibernate-mapping>
    <class name="modele.core.Sportif" table="sportif" lazy="false">
    	<id name="numero" type="integer" column="num_user">
    		<generator class="native">
    			<param name="sequence">user_num_user_seq</param>
    		</generator>
    	</id>
    	<property name="nom" type="string" column="nom"/>
    	<property name="dateNaiss" type="date" column="date_naiss"/>
    	<property name="taille" type="integer" column="taille"/>
    	<property name="poids" type="integer" column="poids"/>
    	<property name="vo_max" type="integer" column="vo_max"/>
    	<property name="max_hr" type="integer" column="max_hr"/>
    	<property name="sitting_hr" type="integer" column="sitting_hr"/>
    	<property name="genre" type="char" column="genre"/>
    	<property name="activite" type="string" column="activite"/>
     
    	<set name="lesSeances" cascade="all">
    		<key column="sportif"></key>
    		<one-to-many class="modele.core.Seance"/>
    	</set>
    </class>
     
    <class name="modele.core.Seance" table="seance" lazy="false">
    	<id name="numero" type="integer" column="num_seance">
    		<generator class="native">
    			<param name="sequence">seance_num_seance_seq</param>
    		</generator>
    	</id>
    	<property name="nom" type="string" column="nom"></property>
    	<property name="calories" type="integer" column="calories"></property>
    	<property name="date" type="timestamp" column="date"></property>
     
    	<many-to-one name="sportif" class="modele.core.Sportif"></many-to-one>
    </class>
    Toutes les doc que j'ai pu lire ne m'ont pas apporté de réponse. Je fais une erreur, mais je ne sais pas laquelle.

    Ah oui, j'oubliais : lorsque que je ne lie pas les deux mapping, il m'est possible rendre les objets Seance et Sportif persistant, bien sûr sans cascade entre les classes. Mais dès que j'ajoute au mapping de Sportif la balise <set> et au mapping de Seance la clause <one-to-many>, l'erreur hibernate est de type 'BatchUpdateException'.

    Merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2003
    Messages : 64
    Points : 63
    Points
    63
    Par défaut
    Si j'ai bien compris, un sportif participe a des scéances, et une scéance a plusieurs sportif?
    Je ne suis pas sur, mais j'aurais fait comme ca plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <hibernate-mapping>
    	<class name="Sportif" table="sportif">
    		<id name="id" column="id" type="int">
    			<generator class="native" />
    		</id>
     
    		<set name="sceances" table="imp_sportif_sceance" lazy="false"
    			inverse="true">
    			<key column="id_sportif" />
    			<many-to-many class="Sceance" column="id_sceance" />
    		</set>
     
    	</class>
    </hibernate-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
    <hibernate-mapping>
    	<class name="Sceance" table="sceance">
    		<id name="id" column="id" type="int">
    			<generator class="native" />
    		</id>
     
    		<set name="sportifs" table="imp_sportif_sceance" lazy="false"
    			inverse="true">
    			<key column="id_sceance" />
    			<many-to-many class="Sportif" column="id_sportif" />
    		</set>
     
    	</class>
    </hibernate-mapping>

  3. #3
    T2!
    T2! est déconnecté
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 47
    Points
    47
    Par défaut
    En fait, non. Un sportif effectue plusieurs séances d'entrainement. D'où le <set> dans sportif..

    T2!

  4. #4
    T2!
    T2! est déconnecté
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 47
    Points
    47
    Par défaut
    Bon, j'ai éclairci mon problème que je reprends depuis le début. Or donc, j'ai le diagramme des classes suivant :



    Les tables, pour être conformes à ce diagramme UML doivent être construites de la manière suivante :

    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
     
    CREATE TABLE Sportif
    (
      num_sp integer NOT NULL DEFAULT nextval(('public.seq_sportif'::text)::regclass),
      nom_sp character varying(200) NOT NULL,
      etc.
      CONSTRAINT cle_primaire_sportif PRIMARY KEY (num_sp)
    ) 
     
    CREATE TABLE Seance
    (
      num_seance integer NOT NULL DEFAULT nextval('public.seq_seance'::regclass),
      nom_seance character varying(256),
      num_sp integer NOT NULL,
      etc.
      CONSTRAINT cle_primaire_seance PRIMARY KEY (num_seance)
    )
    Dans ces conditions, le mapping hibernate est le suivant :

    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
     
    <class name="modele.core.Sportif" table="Sportif" lazy="false">
    	<id name="numero" type="integer" column="num_sp">
    		<generator class="native">
    			<param name="sequence">seq_sportif</param>
    		</generator>
    	</id>
    	<property name="nom" type="string" column="nom_sp"/>
            etc.
    	<set name="lesSeances" lazy="false">
    		<key column="num_sp"/>
    		<one-to-many class="modele.core.Seance"/>
    	</set> 
    </class>
     
    <class name="modele.core.Seance" table="Seance" lazy="false">
    	<id name="numero" type="integer" column="num_seance">
    		<generator class="native">
    			<param name="sequence">seq_seance</param>
    		</generator>
    	</id>
     
    	<property name="nom" type="string" column="nom"/>
     
    </class>

    Cela fonctionne bien. Le mapping d'un sportif assure simultanément le mapping de toutes les séances qui lui sont rattachées.

    Une remarque : j'ai pour habitude (pas sûr qu'elle soit judicieuse), de refermer mes sessions pratiquement après chaque requête. Or, par défaut, tous les objets Hibernate sont chargés en mode "lazy", c'est-à-dire qu'ils sont remontés effectivement qu'en cas d'accès sur ces objets. Dans le cas précédent, si je referme la session après avoir chargé un sportif, les objets Seances s'ils sont en mode "lazy" sont remontés après fermeture de la session. D'où des exceptions. Pour éviter cela, il est impératif de valoriser l'attribut "lazy=false" dans la clause <set> afin que les séances soient remontées en même temps que le sportif.

    Ceci résout mon problème. Merci à robbiano78 pour m'avoir mis sur la voie.

    T2!

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

Discussions similaires

  1. problème d'insertion de données dans une map
    Par kifouillou dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 21/02/2007, 10h10
  2. [Hibernate] Problème dans le fichier mapping
    Par sabour_mounir dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2006, 11h41
  3. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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