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 :

commit , violation de contraite d'intétrité


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut commit , violation de contraite d'intétrité
    Bonjour,

    J'ai deux table A et B.
    La B contient l'identifiant d'une ou plusieurs instances de A
    B a une contraite d'intégrité : l'identifiant de A doit exister

    j'ai donc une relation OnetoMany

    Lorsque je fait un save d'un objet A , puis un save de plusiurs objets B qui contiennent l'identifiant A et que je fais un commit , j'ai une erreur de violation de l'intégrité au commit() me disant que le parent n'existe pas.

    En effet , le commit de A n'as pas encore eu lieu mais A a été sauver pourtant.

    comment faire pour ne faire qu'un commit et ne pas violer ka contraite ?
    Pourquoi apres le save , l'objet A n'est t'il pas considéré comme étant en base ?

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Pour ne pas laisser A être sauvegardé par Hibernate lui même ?!?
    J'avais déjà eu ce problème également mais pour ma part cela se justifiait par un modele avec double contrainte d'integrité (B vers A et A vers B )

    Ici le problème est assez classique. Toutefois il est possible qu'il était demandé un commit() pour que la sauvegarde fonctionne. Si tu veux tout faire d'une traite , ajoute en attribut de la relation One-to-many : cascade="insert-update" pour que tu n'aies qu'a demander les sauvegardes de B et tout devrait rentrer dans l'ordre

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut
    bonjour,

    Merci de ta réponse mais cela ne résoud pas la violation de contraite.
    Ce qui est bizarre , c'est que les save() se font sans problème.
    C'est au niveau du Commit() que la violation apparait.

    a noter que j'ai mis cascade="save-update" , "insert-update" n'existe pas.

    J'ai trouvé sur un site que l'on pouvait faire un session.persist() mais la methode persist() n'existe pas pour une session.

    Bref , j'ai toujours ma violation ...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Au temps pour moi, je ne me souvenais plus exactement (et du coup j'ai mis insert à tous mes posts en parlant depuis hier soir ... durdur ).

    Ca me parait tout de même étrange car j'ai EXACTEMENT le même système de mon coté et tout fonctionne sans aucun problème. Peut-on voir ton mapping et la classe sauvegardant les données ? Peut on aussi avoir la trace de l'erreur exacte ?

    Merci bien

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut
    voici l'erreur :

    Caused by: java.sql.BatchUpdateException: ORA-02291: violation de contrainte (PLSVISTA.FKABBFA7A42509EE) d'intégrité - touche parent introuvable

    La contraite sql :

    ALTER TABLE COMMANDE ADD CONSTRAINT FKABBFA7A42509EE
    FOREIGN KEY (ID_BL)
    REFERENCES PLSVISTA.BON_LIVRAISON (ID_BL) ;

    L'association de la classe B :

    <!-- Associations -->
    <many-to-one name="bonLivraison" class="org.ultimania.model.BonLivraison" column="ID_BL" cascade="save-update" />

    La classe A :

    <class name="org.ultimania.model.BonLivraison" table="BON_LIVRAISON"
    lazy="true">
    <!-- where="ETAT=0" dynamic-update="true" dynamic-insert="true" -->
    <id name="idBl" type="java.lang.Long" column="ID_BL">
    <generator class="sequence">
    <param name="sequence">SEQ_ID_BON_LIVRAISON</param>
    </generator>

    <!--
    <set name="commandes">
    <key column="ID_BL" />
    <one-to-many class="org.ultimania.model.Commande" />
    </set>
    -->


    a noter que ce set est en commentaire ...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    1/ Un tit peu de formatage de ton post serait le bienvenue (tag CODE surtout)
    2/ Dans le cas où le set n'est pas en commentaire, tu as ici une relation 1..N bidirectionnelle si je ne m'abuse. Il manque donc un inverse=true sur l'une des deux parties (dans le set par exemple).

    Sinon de mon côté j'ai exactement la même chose avec une entité CONTRAT et TYPE_CONTRAT et cela fonctionne sans aucun problème... cela dit, je faisais peut être le commit avant pour faciliter l'enregistrement. Cependant, je ne faisais plus de la même manière dans mon second cas où je n'enregistrais QUE l'entité mère avec tout ses nouveaux objets rattachés, et l'ensemble fonctionnait à merveille... c'est vraiment étrange.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!--Champ de type Antecedent-->
    <many-to-one name="antecedent" column="ANTCDT" cascade="save-update"/>
    Normalement, dans les logs,on voit qu'il enregistre et met à jour tous les fils avant d'enregistrer le père...

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

Discussions similaires

  1. insertion, violation de contraint et commit
    Par elkamaro dans le forum Administration
    Réponses: 17
    Dernier message: 05/01/2010, 17h23
  2. Interbase en réseau:commit ne s'appliquent pa aux autres pc?
    Par Harry dans le forum Bases de données
    Réponses: 9
    Dernier message: 27/05/2004, 14h10
  3. Query Begin et Commit son sur un bateau....
    Par faoz75 dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/08/2003, 11h48
  4. commit et rollback....?
    Par The_Nail dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/06/2003, 14h36
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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