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

Spring Java Discussion :

Erreur spring lors de la substitution d'un sous-objet


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 156
    Par défaut Erreur spring lors de la substitution d'un sous-objet
    Bonjour,

    Désolé si mon titre est obscur, mon soucis n'est pas simple à résumer en quelques mots !

    Je dispose d'un objet Individu (que j'épure ici), qui a un attribut dont le type peut varier (caractIndividu). Je passe donc par un type abstrait et deux implémentation de ce type.
    Or, j'ai une erreur sur le cas suivant : un objet Individu récupéré en BDD que je souhaite modifier (avec un appel au setter) en attribuant une valeur à l'attribut caractIndividu d'un type différent de celui de sa valeur actuelle (à la sélection, "caractIndividu" est de type "CaractIndividu1", je souhaite le mettre à jour avec un type "CaractIndividu2").

    L'erreur est la suivante : "a different object with the same identifier value was already associated with the session"

    Mon code :
    Classe Individu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Entity
    @Table(name = "individu ")
    public class Individu implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@EmbeddedId
    	private PkIndividu id;
     
    	@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
    	@JoinColumn(name="idind", referencedColumnName="idind")
    	private AbstractCaractIndividu caractIndividu;
    }
    Mon objet AbstractCaracteristiqueIndividu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    public abstract class AbstractCaractIndividu implements Serializable {
     
    	private static final long serialVersionUID = -1675072412134818653L;
     
    	@Id
    	private String id;
     
    	private Integer idind;
    }
    Les deux implémentation de cette classe abstraite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Entity
    @Table(name = "CaractIndiv1")
    public class CaractIndiv1 extends TravailAbstractIndividuBfi {
     
    	private static final long serialVersionUID = -5942318785394457679L;
     
    	public TravailIndividuInsert() {}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Entity
    @Table(name = "CaractIndiv2")
    public class CaractIndiv2 extends TravailAbstractIndividuBfi {
     
    	private static final long serialVersionUID = 6880488264246993157L;
     
    	public TravailIndividuInsert() {}
    }
    Ce modèle peut sembler biscornu mais :
    * J'ai modifié sciemment les noms des objets pour ne pas avoir à détailler l'aspect fonctionnel de mon projet
    * La séparation en deux tables différentes des "CaractIndividu" à du sens au niveau modèle de données
    * Je n'ai de toute façon pas la liberté de modifier la structure existante.

    Avez-vous des idées pour me sortir de cette panade (j'espère avoir été assez compréhensible :S) ?

    Merci d'avance pour vos lumière.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Vous ne pouvez pas faire cela : il faut supprimer l'ancien objet et en créer un nouveau .
    Même en offline, il faudrait enlever le record de type 1 et créer un record de type 2, sinon au chargement de l'application il est impossible de déterminer la classe de l'objet : ce serait comme si l'objet appartenait à 2 classes.

    Attention à propager le nouvel objet à tous ceux qui connaissait l'ancien, et si vous réutilisez la PK attention à la cache…

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 156
    Par défaut
    Merci pour cette réponse, bien qu'un poil frustrante !
    Si je comprends bien, je dois commiter dans un premier temps la suppression de mon enregistrement de type 1, et ensuite insérer mon enregistrement de type 2 ? Ou cela peut-il être fait dans deux instructions à la suite, commitées au même moment ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    cela devrait fonctionner dans la même transaction

Discussions similaires

  1. Erreur 404 lors de lancement de tomcat 6 sous eclipse 3.6
    Par clubist dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 05/01/2011, 21h45
  2. Réponses: 15
    Dernier message: 16/09/2004, 09h37
  3. [ACCESS] [JET] [ADO] Erreur 3000 lors d'un update
    Par Benjamin GAGNEUX dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/08/2004, 21h16
  4. Question facile, erreur bizzare lors d'un Left, Top
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2004, 12h56
  5. Erreur windows lors du malloc
    Par Elessar dans le forum C
    Réponses: 5
    Dernier message: 16/12/2003, 08h53

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