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 :

[Hibernate-MySQL] Problème de contraintes ?!


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut [Hibernate-MySQL] Problème de contraintes ?!
    Bonjour,
    j'ai quelques soucis dans la conception de ma BDD. J'utilise MySQL et lorsque j'utilise mon application web, j'ai (dans mon serveur JOnAS) les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    08:24:37,027 DEBUG SchemaUpdate:149 - alter table t_gpco add index FKCB5D64008FB02E86 (id_gpco), add constraint FKCB5D64008FB6 foreign key (id_gpco) references t_domaine (id_domaine)
    08:24:37,105 ERROR SchemaUpdate:155 - Unsuccessful: alter table t_gpco add index FKCB5D64008FB02E86 (id_gpco), add constraint B5D64008FB02E86 foreign key (id_gpco) references t_domaine (id_domaine)
    08:24:37,105 ERROR SchemaUpdate:156 - Can't create table .\suivi_activite\#sql-7ec_92e.frm' (errno: 150)
    08:24:37,105 DEBUG SchemaUpdate:149 - alter table t_groupe add index FK69B62BF1E8E6EC37 (id_groupe), add constraint FK69B62BF
    6EC37 foreign key (id_groupe) references t_domaine (id_domaine)
    08:24:37,199 ERROR SchemaUpdate:155 - Unsuccessful: alter table t_groupe add index FK69B62BF1E8E6EC37 (id_groupe), add constr FK69B62BF1E8E6EC37 foreign key (id_groupe) references t_domaine (id_domaine)
    08:24:37,199 ERROR SchemaUpdate:156 - Can't create table '.\suivi_activite\#sql-7ec_92e.frm' (errno: 150)
    Et voici la création des tables :
    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
     
    -- 
    -- Structure de la table `t_gpco`
    -- 
     
    CREATE TABLE `t_gpco` (
      `id_gpco` tinyint(4) NOT NULL auto_increment,
      `lib_gpco` varchar(20) character set latin1 collate latin1_general_cs NOT NULL,
      `id_domaine` int(4) NOT NULL,
      PRIMARY KEY  (`id_gpco`),
      KEY `t_gpco_ibfk_1` (`id_domaine`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ;
     
    -- 
    -- Structure de la table `t_groupe`
    -- 
     
    CREATE TABLE `t_groupe` (
      `id_groupe` tinyint(4) NOT NULL auto_increment,
      `lib_groupe` varchar(20) character set latin1 collate latin1_general_cs NOT NULL,
      `id_domaine` int(4) NOT NULL,
      PRIMARY KEY  (`id_groupe`),
      KEY `t_groupe_ibfk_1` (`id_domaine`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
     
    -- 
    -- Structure de la table `t_domaine`
    -- 
     
    CREATE TABLE `t_domaine` (
      `id_domaine` int(4) NOT NULL auto_increment,
      `lib_domaine` varchar(20) character set latin1 collate latin1_general_cs NOT NULL,
      `tab_name` varchar(20) NOT NULL,
      `espace_depot` varchar(250) NOT NULL,
      PRIMARY KEY  (`id_domaine`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
     
    -- 
    -- Contraintes pour la table `t_correspondance`
    -- 
    ALTER TABLE `t_correspondance`
      ADD CONSTRAINT `t_correspondance_ibfk_18` FOREIGN KEY (`id_groupe`) REFERENCES `t_groupe` (`id_groupe`) ON DELETE CASCADE,
      ADD CONSTRAINT `t_corresp_ibfk_19` FOREIGN KEY (`id_intervenant`) REFERENCES `t_intervenant` (`id_intervenant`) ON DELETE CASCADE;
     
    -- 
    -- Contraintes pour la table `t_gpco`
    -- 
    ALTER TABLE `t_gpco`
      ADD CONSTRAINT `t_gpco_ibfk_1` FOREIGN KEY (`id_domaine`) REFERENCES `t_domaine` (`id_domaine`) ON DELETE CASCADE;
     
    -- 
    -- Contraintes pour la table `t_groupe`
    -- 
    ALTER TABLE `t_groupe`
      ADD CONSTRAINT `t_groupe_ibfk_1` FOREIGN KEY (`id_domaine`) REFERENCES `t_domaine` (`id_domaine`) ON DELETE CASCADE;
    J'ai l'impression que ma base n'est pas correctement conçue à 100% (et c'est pour ça que Hibernate essaie d'ajouter de nouvelles contraintes).
    Pouvez- vous me dire si la base semble correcte ou au contraire, faut-il ajouter de nouvelles contraintes ?

    Merci
    (@_@)

  2. #2
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Euh c'est je pense, une erreur de copier coller mais il manque les tables t_intervenants et t_correspondance je crois

    Sinon l'ensemble des contraintes ont l'air d'etre correctes. Ce qui parait etrange ici c'est ces dernieres erreurs car :
    - il crée tout d'abord un index sur tes clés primaire de t_gcpo et t_groupe puis il veut mettre une clé étrangère à partir des clé primaire id_groupe et id_gcpo vers id_domaine de domaine, ... , chose totalement fausse par rapport à ton modèle je pense

    Donc a voir si ton mapping ne lui donne pas de fausses indications. Cela dit, si ces erreurs ne posent pas encore de souci dans la continuité de l'utilisation d'hibernate, ca ne devrait pas etre trop grave à partir du moment ou, ce qu'il fait, peut faire vivre la base sans (un index et une fk fausse en moins, c'est pas bien grave ). D'ailleurs l'erreur vient surement du fait que les types de id_domaine et t_groupe, tgcpo ne sont pas les mêmes
    See you, space cowboy... and if you're satisfied, click on

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    En effet, j'ai oublié quelques tables. Les voici :
    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
    -- 
    -- Structure de la table `t_intervenant`
    -- 
     
    CREATE TABLE `t_intervenant` (
      `id_intervenant` varchar(8) character set latin1 collate latin1_general_cs NOT NULL,
      `prenom_nom` varchar(30) character set latin1 collate latin1_general_cs NOT NULL,
      `actif` tinyint(4) NOT NULL default '1',
      `application` varchar(20) default NULL,
      `droit` varchar(20) NOT NULL,
      PRIMARY KEY  (`id_intervenant`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
    -- 
    -- Structure de la table `t_correspondance`
    -- 
     
    CREATE TABLE `t_correspondance` (
      `id_groupe` tinyint(4) NOT NULL,
      `id_intervenant` varchar(8) character set latin1 collate latin1_general_cs NOT NULL,
      KEY `t_correspondance_ibfk_18` (`id_groupe`),
      KEY `t_corresp_ibfk_19` (`id_intervenant`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Et voilà mon mapping hibernate (si jamais ça peut servir...)
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <hibernate-mapping>
     
    	<class name="tables.T_Domaine" table="t_domaine">
    		<id name="idDomaine" type="integer" column="id_domaine">
    			<generator class="increment" />
    		</id>
    		<property name="libDomaine">
    			<column name="lib_domaine" />
    		</property>
    		<property name="tab_name">
    			<column name="tab_name" />
    		</property>
    		<property name="espace_depot">
    			<column name="espace_depot" />
    		</property>
     
    		<set name="idGroupe" cascade="all">
    			<key column="id_groupe" />
    			<one-to-many class="tables.T_Groupe" />
    		</set>
     
    		<set name="idGPCO" cascade="all">
    			<key column="id_gpco" />
    			<one-to-many class="tables.T_GPCO" />
    		</set>
    	</class>
     
    	<class name="tables.T_Groupe" table="t_groupe">
    		<id name="idGroupe" type="integer" column="id_groupe">
    			<generator class="increment" />
    		</id>
    		<property name="libGroupe">
    			<column name="lib_groupe" />
    		</property>
     
    		<property name="id_domaine" />
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_groupe" />
    			<many-to-many column="id_intervenant"
    				class="tables.T_Intervenant" />
    		</set>
    	</class>
     
    	<class name="tables.T_GPCO" table="t_gpco">
    		<id name="idGPCO" type="integer" column="id_gpco">
    			<generator class="increment" />
    		</id>
    		<property name="libGPCO">
    			<column name="lib_gpco" />
    		</property>
    		<property name="id_domaine" />
    	</class>
     
     
    	<class name="tables.T_Intervenant" table="t_intervenant">
    		<id name="idIntervenant" column="id_intervenant" />
    		<property name="libIntervenant">
    			<column name="prenom_nom" />
    		</property>
     
    		<property name="actif">
    			<column name="actif" />
    		</property>
     
    		<property name="application">
    			<column name="application" />
    		</property>
     
    		<property name="droit">
    			<column name="droit" />
    		</property>
     
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_intervenant" />
    			<many-to-many column="id_groupe" class="tables.T_Groupe" />
    		</set>
    		<set name="ficheS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_S" />
    		</set>
    		<set name="ficheOS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_OS" />
    		</set>
    	</class>
     
    </hibernate-mapping>
    (@_@)

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Alors plusieurs choses :

    1- Ton identifiant d'intervenant n'a pas de generateur ?
    2- Tes associations de domaine sont fausses, ou plutot, mal mappées. En effet, la clé sur laquelle tu vas construire la collection n'est pas id_groupe ou id_gpco mais bien id_domaine. En signalant que ce sont des objets de type t_groupe et _gpco, il ira de lui même chercher les champs dans la bonne table.
    3- Veilles bien à l'utilisation de inverse=true dans tes associations, ton mapping les indique en bidirectionnel, tu dois donc faire comprendre à Hibernate que ce sont les mêmes objets qui sont mis en relations dans les deux cas.

    Voila, je pense que ces corrections pourront apporter quelque chose à ton problème et ainsi résoudre tes soucis de construction de base de données (enfin je l'espère).
    See you, space cowboy... and if you're satisfied, click on

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    1- Ton identifiant d'intervenant n'a pas de generateur ?
    Non, ce n'est pas un id qui s'auto incrémente.

    2- Tes associations de domaine sont fausses, ou plutot, mal mappées. En effet, la clé sur laquelle tu vas construire la collection n'est pas id_groupe ou id_gpco mais bien id_domaine. En signalant que ce sont des objets de type t_groupe et _gpco, il ira de lui même chercher les champs dans la bonne table.
    Je ne vois pas très bien dans le fichier où est-ce que tu vois ça.
    Je ne voudrai pas que tu me donnes la solution (je préfère la trouver par moi-même), mais il me faudrait uniquement quelques indices...

    3- Veilles bien à l'utilisation de inverse=true dans tes associations, ton mapping les indique en bidirectionnel, tu dois donc faire comprendre à Hibernate que ce sont les mêmes objets qui sont mis en relations dans les deux cas.
    Donc là, si j'ai bien compris. Il serait meilleur de mettre un "inverse=true" dans les associations. Mais je ne vois pas lesquelles Je suppose qu'il faut le mettre dans les set...

    Merci pr cette précieuse assistance !
    (@_@)

  6. #6
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pour l'erreur voici les indices :

    - Regarde les erreurs d'ajout de contraintes que tu avais signalées au début.
    - Tu vois bien ici que ces contraintes n'ont normalement pas lieu d'etre (les FK et non les index)
    - Regarde ton mapping et surtout tout ce qui peut lier les tables concernées par ton erreur (donc les relations entre les tables)
    - Verifie les jointures surtout. (cf la doc, tu es dans le cas d'association bidirectionnelle "1 à plusieurs" avec clé étrangère).

    Pour inverse=true, cela dépend surtout de l'endroit par lequel tu sauvegardes tes objets. (cf la doc sur la persistance des associations bidirectionnelles)

    Bon courage pour les corrections
    See you, space cowboy... and if you're satisfied, click on

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    J'ai beau chercher et lire, mais je crois que j'ai vraiment du mal.
    J'ai ajouté les inverse=true :
    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
    	<class name="tables.T_Groupe" table="t_groupe">
    		<id name="idGroupe" type="integer" column="id_groupe">
    			<generator class="increment" />
    		</id>
    		<property name="libGroupe">
    			<column name="lib_groupe" />
    		</property>
     
    		<property name="id_domaine" />
    		<set name="correspondance" table="t_correspondance" inverse="true">
    			<key column="id_groupe" />
    			<many-to-many column="id_intervenant"
    				class="tables.T_Intervenant" />
    		</set>
    	</class>
    ...
    	<class name="tables.T_Domaine" table="t_domaine">
    		<id name="idDomaine" type="integer" column="id_domaine">
    			<generator class="increment" />
    		</id>
    		<property name="libDomaine">
    			<column name="lib_domaine" />
    		</property>
    		<property name="tab_name">
    			<column name="tab_name" />
    		</property>
    		<property name="espace_depot">
    			<column name="espace_depot" />
    		</property>
     
    		<set name="idGroupe" cascade="all" inverse="true">
    			<key column="id_groupe" />
    			<one-to-many class="tables.T_Groupe" />
    		</set>
     
    		<set name="idGPCO" cascade="all" inverse="true">
    			<key column="id_gpco" />
    			<one-to-many class="tables.T_GPCO" />
    		</set>
    	</class>
    Ensuite, je ne vois plus quelles modifs je peux faire
    A part que je peux changer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <class name="tables.T_GPCO" table="t_gpco">
    		<id name="idGPCO" type="integer" column="id_gpco">
    			<generator class="increment" />
    		</id>
    		<property name="libGPCO">
    			<column name="lib_gpco" />
    		</property>
    		<property name="id_domaine" />
    	</class>
    Par une relation manu-to-one, du genre... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <many-to-one name="address" 
            column="addressId"
            not-null="true"/>
    Un peu d'aide serait la bienvenue
    (@_@)

  8. #8
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pas de souci

    08:24:37,105 ERROR SchemaUpdate:155 - Unsuccessful: alter table t_gpco add index FKCB5D64008FB02E86 (id_gpco), add constraint B5D64008FB02E86 foreign key (id_gpco) references t_domaine (id_domaine)
    (...)
    08:24:37,199 ERROR SchemaUpdate:155 - Unsuccessful: alter table t_groupe add index FK69B62BF1E8E6EC37 (id_groupe), add constr FK69B62BF1E8E6EC37 foreign key (id_groupe) references t_domaine (id_domaine)
    Voila ton erreur avec les elements importants surlignés. Ici, il veut ajouter des contraintes de clé étrangères sur les clés primaires de t_gpco et t_groupe pointant vers la clé primaire de t_domaine
    Ce qui signifie donc que tu as signalé quelquepart dans ton mapping que ces clés était étrangères à id_domaine de la table domaine.

    En regardant ton mapping les relations entre domaine et t_gpco et t_groupe sont ls suivantes :

    t_gpco vers domaine && t_groupe vers domaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="id_domaine" />
    Ce qui est normal vu que domaine est un attribut donc bien mappé. (cela se traduit par : id_domaine de ces tables sont des clés étrangères de la table domaine)

    Maintenant, et c'est la que tu n'as pas du faire attention, tu as les autres extremités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		<set name="idGroupe" cascade="all" inverse="true">
    			<key column="id_groupe" />
    			<one-to-many class="tables.T_Groupe" />
    		</set>
    
    		<set name="idGPCO" cascade="all" inverse="true">
    			<key column="id_gpco" />
    			<one-to-many class="tables.T_GPCO" />
    		</set>
    Ici tu exprimes bien la collection mais tu précises avec l'attribut "key" que l'id_domaine de ton domaine sur ces deux objets (t_groupe et t_gpco) sera leurs attributs id_groupe et id_gpco ! En interprétation de clés étrangères, cela signifie que les clés étrangères de domaine sur les tables t_groupe et t_gpco sont les champs respectifs id_groupe et id_gpco... ce qui n'est pas vrai puisque ce sont les champs id_domaine de chaque table.

    Il suffit donc que tu remplaces ces deux valeurs par id_domaine et ton mapping aisi que la creation de la base devraient se faire correctement

    Bon courage, en esperant que cette explication fut assez didactique pour que tu comprennes le raisonnement que j'ai appliqué
    See you, space cowboy... and if you're satisfied, click on

  9. #9
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Je n'ai qu'une seule chose à te dire, BizuR : encore bravo !
    Merci de tes explications et de faire en sorte que ce forum soit vraiment utile.

    Pour info, j'ai donc uniquement modifié mon mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <set name="idGroupe" cascade="all" inverse="true">
    			<key column="id_domaine" />
    			<one-to-many class="tables.T_Groupe" />
    		</set>
    
    		<set name="idGPCO" cascade="all" inverse="true">
    			<key column="id_domaine" />
    			<one-to-many class="tables.T_GPCO" />
    		</set>
    Et là, tout est passé nickel !

    Encore Merci BizuR !
    (@_@)

  10. #10
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    De rien !

    Et bon courage pour la suite

    PS: Un tit tag ?!?
    See you, space cowboy... and if you're satisfied, click on

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

Discussions similaires

  1. Problème d'expiration de session Hibernate - Mysql
    Par mikak dans le forum Hibernate
    Réponses: 0
    Dernier message: 20/02/2012, 09h57
  2. [Hibernate-MySQL] Problème identification du DriverClass
    Par seyar666 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 16/01/2012, 00h29
  3. [MVC] Problème création projet MVC/Hibernate/MySql
    Par tomy29 dans le forum Spring Web
    Réponses: 0
    Dernier message: 23/03/2011, 15h37
  4. Problème déploiement Tomcat,Hibernate,MySQL
    Par FunkyBreizh dans le forum MySQL
    Réponses: 0
    Dernier message: 30/06/2009, 14h53
  5. [EJB2.1 Entity] [CMP] [MySQL] Problème avec clé primaire en auto increment
    Par tery dans le forum Java EE
    Réponses: 6
    Dernier message: 16/07/2004, 11h28

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