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 se trompe dans la création de Foreign Keys


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut Hibernate se trompe dans la création de Foreign Keys
    Bonjour à tous !

    J'ai un souci en ce moment avec Hibernate. Pour une table en particulier il se plante en créant des clés étrangères erronnées.

    Dans mon application j'ai notamment des "utilisateurs" et des "opportunités" (le sens n'a pas d'importante).

    Comme il s'agit d'une relation many-to-many qui doit porter une information j'ai décidé de passer par un objet intermédiaire que j'ai appellé "OppUser" et qui contient un entier.

    Cet objet "OppUser" porte une référence à l'opportunité et une référence à un utilisateur.

    Voici son 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
    15
    16
    17
    18
    <?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="fr.habipro.crm.models">
      <class name="OppUser">
        <id name="id">
            <generator class="native"></generator>
        </id>
     
     
        <property name="nbsocs" type="integer"></property>
     
        <many-to-one name="opp" column="id_opp"></many-to-one>
        <many-to-one name="u" column="id_user"></many-to-one>
     
      </class>
    </hibernate-mapping>
    Et voici les foreign keys qu'il génère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      ADD CONSTRAINT `FK187DB6FACF3199EB` FOREIGN KEY (`id_user`) REFERENCES `user` (`id`),
      ADD CONSTRAINT `FK187DB6FA2D0EC05D` FOREIGN KEY (`id_user`) REFERENCES `opportunite` (`id`),
      ADD CONSTRAINT `FK187DB6FA83651579` FOREIGN KEY (`id_opp`) REFERENCES `opportunite` (`id`);
    Comme vous pouvez le constater, j'ai deux clé étrangères sur mon champ id_user. L'une est correcte et fait référence à la table utilisateur, l'autre est fausse et fait référence à la table opportunité.

    Donc en gros c'est le bordel dès que je fait un enregistrement dans cette table parce que dès que j'insère une valeur dans "id_user" j'ai une violation de contrainte de clé étrangère.

    Je vous met également ma classe OppUser au cas où :

    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
    public class OppUser {
    	private long id;
    	private Opportunite opp;
    	private User u;
    	private Integer nbsocs;
     
    	public OppUser() {
    		super();
    	}
    	public long getId() {
    		return id;
    	}
    	public void setId(long id) {
    		this.id = id;
    	}
    	public Opportunite getOpp() {
    		return opp;
    	}
    	public void setOpp(Opportunite opp) {
    		this.opp = opp;
    	}
    	public User getU() {
    		return u;
    	}
    	public void setU(User u) {
    		this.u = u;
    	}
    	public Integer getNbsocs() {
    		return nbsocs;
    	}
    	public void setNbsocs(Integer nbsocs) {
    		this.nbsocs = nbsocs;
    	}
    }
    Avez-vous déjà rencontré un problème similaire ?
    En attendant je désactive l'update du schéma à chaque lancement mais comme je suis encore en phase de développement j'ajoute régulièrement de nouvelles tables et ça commence à devenir problématique.

    Je vous remercie d'avance pour votre aide !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ADD CONSTRAINT `FK187DB6FA2D0EC05D` FOREIGN KEY (`id_user`) REFERENCES `opportunite` (`id`)
    me laisse à penser que tu as un relation one-to-many "opportunité -> oppuser" définie dans ta classe opportunité mais qui pointe sur le userId plutot que sur l'opportunitéId. On peux voir le mapping de opportunité pour en etre sur?

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    C'est tout à fait ça. A force de faire des copiers/coller on finit par oublier de corriger le petit mot qui fait tout sauter

    J'ai corrigé et le schéma généré est correct.

    Merci tchize_

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2010, 17h44
  2. Création de Foreign Key
    Par chh2008 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2010, 09h05
  3. Réponses: 6
    Dernier message: 14/05/2009, 11h01
  4. pb oracle création table - foreign key
    Par dédéf dans le forum Oracle
    Réponses: 3
    Dernier message: 29/11/2005, 11h21
  5. foreign key dans mysql
    Par guillevin dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 08/04/2004, 15h07

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