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 :

Cascade="all" ou pas ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Par défaut Cascade="all" ou pas ?
    Bonjour,
    je ne sais pas du tout comment gérer mon mapping.

    Context:

    J'ai 3 types d'objets: enduro, equipe, pecheur

    Enduro peut contenir plusieurs equipe. Equipe doit contenir 2 pecheurs.

    Problème: je voudrais que lorsque que je sauvegarde un enduro qui contient des equipes et des pecheurs, tout se sauvegarde d'un coup à l'appel de la méthode saveOrUpdate().

    Pour l'instant, j'arrive à sauvegarder un enduro tout seul mais pas avec le reste.

    L'erreur actuelle est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    org.hibernate.exception.ConstraintViolationException: could not insert: [com.enduro.entites.Pecheur]
    com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'idEquipe' cannot be null
    Je pense que cela est dûe au fait que Equipe n'est pas sauvé avant Pecheur.

    Voici mes mappings:

    Enduro

    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.enduro.entites">
    	<class name="Enduro" table="enduro">
    		<id
    			column="id"
    			name="Id"
    			type="integer"
    			unsaved-value="0"
    		>
    			<generator class="native" />
    		</id>
    		<property
    			column="poids"
    			length="20"
    			name="Poids"
    			not-null="false"
    			type="string"
    		 />
    		<property
    			column="titre"
    			length="20"
    			name="Titre"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="dateDebut"
    			name="DateDebut"
    			not-null="false"
    			type="timestamp"
    		 />
    		<property
    			column="dateFin"
    			name="DateFin"
    			not-null="false"
    			type="timestamp"
    		 />
     
    		<set inverse="true" name="Equipes" cascade="all">
    			<key column="idEnduro" />
    			<one-to-many class="Equipe" />
    		</set>
    	</class>
    </hibernate-mapping>
    Equipe

    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.enduro.entites">
    	<class name="Equipe" table="equipe">
    		<id
    			column="id"
    			name="Id"
    			type="integer"
    			unsaved-value="0"
    		>
    			<generator class="native" />
    		</id>
    		<property
    			column="nom"
    			length="20"
    			name="Nom"
    			not-null="true"
    			type="string"
    		 />
    		<many-to-one
    			class="Enduro"
    			name="Enduro"
    			not-null="true"			
    		>
    			<column name="idEnduro" />
    		</many-to-one>
    		<many-to-one
    			class="Pecheur"
    			name="Pecheur1"
    			not-null="true"
    			cascade="all"
    		>
    			<column name="idPecheur1" />
    		</many-to-one>
    		<many-to-one
    			class="Pecheur"
    			name="Pecheur2"
    			not-null="true"
    			cascade="all"
    		>
    			<column name="idPecheur2" />
    		</many-to-one>
    	</class>
    </hibernate-mapping>
    Pecheur

    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
    78
    79
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.enduro.entites">
    	<class name="Pecheur" table="pecheur">
    		<id
    			column="id"
    			name="Id"
    			type="integer"
    			unsaved-value="0"
    		>
    			<generator class="native" />
    		</id>
    		<property
    			column="codePostal"
    			length="10"
    			name="CodePostal"
    			not-null="false"
    			type="integer"
    		 />
    		<property
    			column="ville"
    			length="20"
    			name="Ville"
    			not-null="false"
    			type="string"
    		 />
    		<property
    			column="telephone"
    			length="10"
    			name="Telephone"
    			not-null="false"
    			type="integer"
    		 />
    		<property
    			column="adresse"
    			length="20"
    			name="Adresse"
    			not-null="false"
    			type="string"
    		 />
    		<property
    			column="prenom"
    			length="20"
    			name="Prenom"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="email"
    			length="20"
    			name="Email"
    			not-null="false"
    			type="string"
    		 />
    		<property
    			column="nom"
    			length="20"
    			name="Nom"
    			not-null="true"
    			type="string"
    		 />
     
    		<many-to-one
    			class="Equipe"
    			name="Equipe"
    			not-null="true"
    		>
    			<column name="idEquipe" />
    		</many-to-one>
     
    		<set inverse="true" name="Prises" cascade="all">
    			<key column="idPecheur" />
    			<one-to-many class="Prise" />
    		</set>
    	</class>
    </hibernate-mapping>
    Si quelqu'un comprend comment fonctionne cascade, merci de m'aider !!

    J'attends vos réponse avec impatience

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    Dans le mapping de Enduro, spécifie not-null="true" sur la clé étrangère. Ainsi Hibernate ne tentera pas d'insérer une Equipe avec la clé étrangère vers Enduro à null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set inverse="true" name="Equipes" cascade="all">
    			<key column="idEnduro" not-null="true" />
    			<one-to-many class="Equipe" />
    		</set>
    Si je puis me permettre quelques critiques :
    Il semblerait, à le vue de ton mapping de Enduro, que la variable portant la relation entre Enduro et Equipe s'appelle "Equipes". Nomme la plutôt "equipes" avec un "e" minuscule. C'est la norme de nommage en Java.

    D'autre part ton mapping entre Equipe et Pecheur semble incorrect. En effet, tu définies du many-to-one des deux côtés. Soit tu fais deux mappings sur tes deux pêcheurs de type "one-to-one", soit tu fais un mapping "one-to-many" entre Equipe et Pecheur (avec une seule clé étrangère Equipe_Id dans ta table Pecheur) et tu limites "programmatiquement" le nombre de pêcheurs dans ton Set<Pecheur> dans la classe Equipe. Consulte le lien suivant pour le mapping <one-to-one> : http://www.hibernate.org/hib_docs/v3...ociations.html

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Par défaut
    Merci pour tout !!

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

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