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 de modification de clé primaire via Hibernate


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 39
    Points
    39
    Par défaut Problème de modification de clé primaire via Hibernate
    Bonjour à tous,

    avez déjà rencontré l'exception :
    org.hibernate.HibernateException: identifier of an instance of dao.type_activite.TypeActivite was altered from ac3 to ac7
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:58)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:164)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at dao.type_activite.ITypeActiviteImpl.updateTypeToTypeU(ITypeActiviteImpl.java:57)
    at dao.test.TestJUnit.testUpdateTypeToTypeU(TestJUnit.java:80)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186)
    Si c'est le cas, alors il se peut que vous ayez une solution pour mon problème.

    J'obtiens cette exception quand j'essaie d'effectuer une mofif sur un objet dont voici l emapping :

    <?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>

    <class name="dao.type_activite.TypeActivite" table="TYPE_ACTIVITE">
    <id name="typeAct" column="TYPEACT">
    <generator class="assigned"/>
    </id>

    <property name="libelleTypeAct" column="LIBELLE"/>

    </class>

    </hibernate-mapping>
    et dont voici le pojo :

    package dao.type_activite;

    import dao.type_activite_unilog.*;

    public class TypeActivite {

    private String typeAct;
    private String libelleTypeAct;



    public TypeActivite(){

    }

    public TypeActivite(String typeAct, String libelleTypeAct) {
    super();
    this.typeAct = typeAct;
    this.libelleTypeAct = libelleTypeAct;
    }


    public String getTypeAct() {
    return typeAct;
    }
    public void setTypeAct(String typeAct) {
    this.typeAct = typeAct;
    }
    public String getLibelleTypeAct() {
    return libelleTypeAct;
    }
    public void setLibelleTypeAct(String libelleTypeAct) {
    this.libelleTypeAct = libelleTypeAct;
    }


    }
    Le dode de la modif contient simplement un set pour modifier le champ "TypeAct' ...

    Je n'arrive pas à resoudre ce prob qui pourtant parait si simple...

    Toute aide sera la bienvenu

    Merci d'avance !

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    tu peux donner ton code pour la modif stp ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 39
    Points
    39
    Par défaut
    Merci de t'interesser à mon prob
    Voici le code de la modif :

    public void updateTypeToTypeU(String Id, TypeActivite t){

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    TypeActivite T = (TypeActivite) session.load(TypeActivite.class, Id);

    //modification des champs
    T.setLibelleTypeAct(t.getLibelleTypeAct());
    T.setTypeAct(t.getTypeAct());

    session.getTransaction().commit();
    }
    Tout ce qu'il fait, c'est de remplacer les deus champs de l'objet à modifier (récupéré via le Id) par ceux de celui passé en paramètres à la méthode.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    est ce que tu recuperes bien TypeActivite T ? regarde en mode debug si ton objet T est bien recupere apres
    TypeActivite T = (TypeActivite) session.load(TypeActivite.class, Id);

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 39
    Points
    39
    Par défaut
    Oui je récupére bient l'objet T
    D'ailleurs la modification du libelle a lieu (si bien sur la modif de la clé est mise en commentaires), ce qui vt dire que l'objet est bel et bien récupéré

    Corrigez moi si je raconte des conneries

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    essaye de faire un session.update(T) avant ton commit

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 39
    Points
    39
    Par défaut

    j'ai rajouté "session.update(T)" mais j'ai toujours la même exception.

    ce problèm est sincèrement étonnant !


  8. #8
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    la j'avoue que je vois pas trop... mais je peux comprendre qu'il y ai un probleme sachant que t'essaye de modifier la cle primaire d'un objet persistant. Tu recuperes cet objet grace a son id mais comment fait hibernate pour modifier l'id de cette objet ? il ne peut plus faire un truc genre "update activity set id="nouveauId" where id="ancienId" puisque tu modifies ancienId ...

    il est assez rare de devoir modifier la cle primaire d'un objet, tu peux pas mettre un id auto_increment dans ta base et un champs typeact comme ca tu te prend plus la tete ?

  9. #9
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Bonjour,
    cela me semble bizarre de vouloir modifier la clef primaire (gestion de index, gestion des clef étrangères ...)
    S'il y a changement de valeur de la clef primaire ne serait il pas plus logique de considérer que c'est une suppresion de l'ancien élémént - ajout d'un nouvel élément ?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 39
    Points
    39
    Par défaut
    Vous avez tout à fait raison...
    Il serait plus judicieux d'ajouter un champ auto-increment à la table et d'en finir

    En tout cas merci beaucoup pour votre aide !!

Discussions similaires

  1. [Core] Problème de connexion à MySQL via Hibernate
    Par wadi3 dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/06/2012, 16h40
  2. Problème de connexion à la base via Hibernate
    Par poitou82 dans le forum Hibernate
    Réponses: 5
    Dernier message: 24/06/2011, 18h51
  3. Problème d'insertion en DB via Hibernate
    Par 2Fick dans le forum Hibernate
    Réponses: 0
    Dernier message: 01/06/2011, 14h21
  4. [AC-2003] Problème de modification de requête via ADO
    Par paidge dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/10/2010, 14h22
  5. Problème de modif via un menu déroulant
    Par PtitGénie dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/07/2009, 10h32

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