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 :

Probleme hibernate modification d'une clé primaire


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut Probleme hibernate modification d'une clé primaire
    Bonjour à tous, j'espere que vous pourriez m'aider à trouver une solution :

    en essayant d'effectuer une modification sur l'identifiant d'une classe, j'obtiens l'exception suivante

    org.hibernate.HibernateException: identifier of an instance of dao.type_activite.TypeActivite was altered from aU4 to aU5
    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_unilog.ITypeActiviteUnilogImpl.update(ITypeActiviteUnilogImpl.java:54)
    at dao.test.TestJUnit.testUpdate(TestJUnit.java:107)
    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)
    voici la classe :


    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
     
    public class TypeActivite {
     
    	private String typeActU;
    	private String libelleTypeActU;
     
    	private Set typesActivites;
     
    	public TypeActiviteUnilog(){
     
    	}
     
    	public TypeActivite(String typeActU, String libelleTypeActU) {
    		super();
    		this.typeActU = typeActU;
    		this.libelleTypeActU = libelleTypeActU;
    	}
     
    	public String getTypeActU() {
    		return typeActU;
    	}
     
    	public void setTypeActU(String typeActU) {
    		this.typeActU = typeActU;
    	}
     
    	public String getLibelleTypeActU() {
    		return libelleTypeActU;
    	}
     
    	public void setLibelleTypeActU(String libelleTypeActU) {
    		this.libelleTypeActU = libelleTypeActU;
    	}
     
     
    	/**
             * @return Returns the typesActivites.
             */
    	public Set getTypesActivites() {
    		return typesActivites;
    	}
    	/**
             * @param typesActivites The typesActivites to set.
             */
    	public void setTypesActivites(Set typesActivites) {
    		this.typesActivites = typesActivites;
    	}
    }

    et voici le mapping hibernate :

    Code xml : 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
    <?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.TypeActivite" table="TYPEACTU">
     
    		<id name="typeActU" column="TYPEACTU">
    			<generator class="assigned"/>
    		</id>
     
    		<property name="libelleTypeActU" column="LIBELLE"/>
     
    		<set name="typesActivites">
    			<key column="TYPEACTU"/>
    			<one-to-many class="dao.type_activite.TypeActivite"/>
    		</set>
     
        </class>
     
    </hibernate-mapping>


    Qlq'un a-t-il une idée pour resoudre ce probleme?
    Merci d'avance

  2. #2
    Membre expérimenté Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Par défaut
    Salut :-)

    En fait, tu ne peux pas modifier l'id d'un objet qui est attaché à une session (logique quand on y pense :-)

    La seule façon, pour pouvoir modifier ce champ est de détacher l'objet. (Attention que lorsque tu le rattacheras à la session il ne s'agira plus du même objet pour Hibernate puisque tu as modifié son id ==> nouvelle entrée dans la db)

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut
    Merci Bibo pour ta reponse qui me pousse à me poser encore 2 questions :
    1- pourquoi est-ce logique de ne pas pouvoir modifier un objet rattaché à la session.
    2- si j'ai bien compris compris la solution que tu me proposes, la modification consistera en la création d'un nouvel objet, son insertion, et enfin la suppression de l'objet que je voulais modifier au départ. est-ce bien ça?

    merci d'avance

  4. #4
    Membre expérimenté Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Par défaut
    1) En fait je n'ai pas dit que tu ne pouvais pas modifier un objet rattaché à la session. Ce serait plutôt bête :-) J'ai dit que la seule chose que tu ne pouvais pas modifier sur un tel objet était son id.

    2) Si tu veux modifier l'id d'un objet rattaché à une session hibernate, la seule façon (je pense ^^) est de détacher l'objet (méthode evict), de modifier son id et ensuite de le rattacher à la session en faisant un save par exemple. Comme c'est son id qui change, Hibernate va effectivement considérer que c'est un nouvel objet et va faire un nouvel insert dans la db.

    Voilà :-)

Discussions similaires

  1. Modification d'une clé primaire
    Par mehdiyou dans le forum SQL
    Réponses: 3
    Dernier message: 14/04/2008, 17h26
  2. Modification d'une clé primaire
    Par mehdiyou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/04/2008, 18h10
  3. Modification d'une cle primaire chaine de charactere
    Par Contrec dans le forum Oracle
    Réponses: 7
    Dernier message: 01/08/2007, 08h15
  4. Probleme d'insertion d'une clef primaire OleAdo
    Par blondelle dans le forum C++Builder
    Réponses: 1
    Dernier message: 26/03/2007, 12h23
  5. [Oracle] modification d'une clé primaire composée
    Par petburn dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2006, 15h58

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