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 :

Erreur 2 représentations de la meme collection


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut Erreur 2 représentations de la meme collection
    Salut à tous,

    J essaie dans un premier temps de vous exposer la chose ...

    Une classe Materiel (objet graphique) + attribut de type Composant (Pojo Hibernate).

    Mon appli. est constituée d' un ensemble de Materiel, et donc ont leur composant associé.

    Lorsque je modifie les proprietes d un materiel, celles si sont répercutées dans le composant.

    Lorsque je sauve l'application, je parcoure l' ensemble des Materiels , et je session.save (monMateriel.getComposant());

    Tout fonctionne nickel ... dans un premier temps , a savoir lors de la premiere sauvegarde.

    Exemple:
    Je plug des materiels dans mon appli. je modifie les proprietes, etc ... ensuite je sauve ... Ca se met a jour dans la BD sans probleme.
    Je modifie je ressauve, ca se met a jour sans probleme aussi.

    Par contre, imaginons que j' ai sauvé sous le nom : 'brol'.
    Ensuite je crée un nouveau panneau , j ajoute des Materiel, et ensuite je sauve, sous le nom 'brol'.

    Je demande donc si l'on veut ecraser l'ancienne sauvegarde.
    Si on répond oui, je supprime les composants de la sauvegarde de cette facon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void supprimeSauvegarde(String save) throws HibernateException {
            Session session = HibernateUtil.currentSession();
            session.beginTransaction();
            List<Composant> tmp1 = session.createQuery("from Composant where sauvegarde LIKE '"+save+"'").list();
            for (Composant c : tmp1)
                session.delete(c);
            session.getTransaction().commit();
        }
    Cela fonctionne sans aucun probleme, mais lorsque je resauve a nouveau, j' obtiens cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xception in thread "AWT-EventQueue-0" org.hibernate.HibernateException: Found two representations of same collection: simulator.hibernate.pojo.Composant.proprietes
    Il faut s'avoir qu' un Composant est composé entre autres, d' un Set<Propriete> , qui donc se sauve sans aucun probleme en BD lors de la premiere sauvegarde.

    Mais si je delete et resauve, ca plante ... je comprend pas pourquoi il me dit que j' ai deux representations de la chose.

    Voici, pour info (si utile) comment je sauve:

    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
     
    private void saveEtat(String sauvegarde) {
            save = sauvegarde;
            for (Object o : Tableau.getInstance().getGraph().getVertices()) {
                Materiel m = (Materiel)o;
                m.getComposant().setSauvegarde(sauvegarde);
                Point2D p = Tableau.getInstance().getVisualization().getGraphLayout().getLocation(m);
                m.getComposant().setPosX((int)p.getX());
                m.getComposant().setPosY((int)p.getY());
                HibernateRequetes.saveObject(m.getComposant());
            }
    }
     
    public static void saveObject (Object comp) throws HibernateException {
            Session session = HibernateUtil.currentSession();
            session.beginTransaction();
            session.save(comp);
            session.flush();
            session.getTransaction().commit();
        }
    Et donc ce code passe sans probleme ... sauf si j' apelle : supprimeSauvegarde avant ...

    Merci de m'aiguiller car là je comprend trop pas ... et ca m' enerve car la sauvegarde en soit se passe sans aucun probleme ...

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    En fait la question est de savoir comment tu as fait ton fichier de mapping pour savoir ce qui se passe quand tu delete un composant pour les propriétés de ce composant.

    Etant donnée l'erreur, je suppose que tu ne deletes pas en cascade. Donc en supposant que tu as un composant composant1 qui a une propriété propriété1, lorsque tu fais delete, composant1 est enlevé de la base, mais pas propriété1.
    Donc quand tu fais save ensuite, il a un conflit entre propriété1 en mémoire et propriété1 en base qui ont le même identifiant ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Sisi, pas de probleme au niveau du mapping :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <set name="proprietes" cascade="all" inverse="true">
                <key column="idComp" />
                <one-to-many class="simulator.hibernate.pojo.Propriete" />
    </set>
    Le delete se passe tout à fait correctement comme déjà dit ... donc je ne comprend pas d' où peut venir le probleme lors du insert ... :/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    argh me dites pas que personne a d' idée

    moi je vois trop pas :s

  5. #5
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ben je vois pas trop en tout cas moi :-(
    A tout hasard, si tu rajoutes un session.flush() dans le delete ça ne change rien ?

    Sinon, à voir si les logs hibernate ne pourraient pas aider à mieux comprendre sur quel objet exactement il y a conflit et pourquoi ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    le flush() dans le delete n' a rien changé.
    Mais je répète, le delete se passe sans aucun problème ... c'est lors de la réinsertion du nouvel objet que bang ca foire ...
    Mais il faut essayer de comprendre :

    je met deux composants sur mon panneau (avec chacun son Set<Propriete>).
    Je sauve sous : 'aaa'.

    je continue a rajouter des composants. Si je fais 'save', il va pas supprimer la sauvegarde mais uniquement faire un saveorupdate... et là tout se passe bien.

    Si maintenant je veux écraser, donc faire un 'save as' 'aaa', il va supprimer les composants dans la bd et ensuite réécrire.

    Mais donc mes deux composants de départ sont écrits deux fois dans la meme session ... le probleme peut venir de là mais je vois pas pourquoi.

    Et pour voir exactement quoi/où, le probleme a donc lieu lors du save as 'aaa' apres avoir deja sauver dans la meme session sous 'aaa'. Lors de la sauvegarde du Set<Propriete> du premier composant sauvé.

    J espere avoir été clair

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    La preuve:

    - je lance l'appli. je crée deux composants, et je les relient.
    - SAVE 'aaa'
    - je supprime les deux composants et les liaisons
    - je recree deux composants et liaisons
    - je save as 'aaa' donc override donc delete et resauve
    - ca passe sans probleme

    ...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Suivant les conseils d'un de mes collègues, je me suis lancé dans une autre approche plus propre et simple.

    J' ai rajouté la table Sauvegarde (idSave, nom);

    Et dans la table Composant j' ai ajouté une FK vers Sauvegarde, pour qu' a chaque composant soit associé une sauvegarde.

    Le Pojo Sauvegarde est donc composé d' un Set de Composants.
    en ajoutant une méthode: ajoutComposant, j' ajoute donc un composant au Set a chaque fois.

    Lorsque je sauvegarde, je fais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void saveEtat(String message) {
            save = new Sauvegarde();
            save.setNom(message);
            for (Object o : Tableau.getInstance().getGraph().getVertices()) {
                Materiel m = (Materiel)o;
                m.getComposant().setSauvegarde(save);
                save.ajoutComposant(m.getComposant());
            }
            HibernateRequetes.saveObject(save);
    Jusque là tout fonctionne nickel.
    Ensuite si je fais un : session.delete (save); tout fonctionne nickel aussi ...

    MAIS meme probleme qu' au début lorsque par exemple je cree un composant, je le sauve sous 'aaa' ensuite je le modifie (je n' ajoute rien, je modifie juste une propriete de ce composant) et au lieu de faire 'save', je fais 'save as' et je sauve sous le meme nom. Dans ce cas, il faut supprimer la sauvegarde, ca fonctionne nickel comme dit ci dessus, mais lorsque je refais le code donné ci dessus, meme erreur: deux représentations de la collection proprietes dans le composant ...

    Je comprend pas comment solutionner la chose ... a croire qu' il faudrait cloner le Materiel a chaque fois ... mais bon ca me semble laid non? et puis... pas sur que ca marche

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Après plusieurs jours de galère enfin ca fonctionne.

    Tout dans une seule transaction, ce qui n' était pas le cas avant.
    Pour ceux que ca pourrait interesser plus tard, voici le code:
    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
     
    private void saveEtat(String message) {
            Session session = HibernateUtil.currentSession();
    	session.beginTransaction();
            if (save != null) {
                if (!save.getNom().equals(message))
                    save = null;
            }
            if (save == null) {
                List<Sauvegarde> sauvegardes = session.createQuery("from Sauvegarde").list();
    	    for (Sauvegarde sauvegarde : sauvegardes) {
                    if (sauvegarde.getNom().equals(message))
                        save = sauvegarde;
                }
    	    if (save == null) {
                    save = new Sauvegarde();
    		save.setNom(message);
                }
            }
     
            save.removeAllComposants();
            for (Object o : Tableau.getInstance().getGraph().getVertices()) {
                Materiel m = (Materiel)o;
                Point2D p = Tableau.getInstance().getVisualization().getGraphLayout().getLocation(m);   
                m.getComposant().setPosX((int)p.getX());
                m.getComposant().setPosY((int)p.getY());
                m.getComposant().setSauvegarde(save);
                save.ajoutComposant(m.getComposant());
            }
     
            save.removeAllJonctions();
            for (Object o : Tableau.getInstance().getGraph().getEdges()) {
                Lien l = (Lien)o;
                if (l.getType().equals("Jonction")) {
                    Jonction j = (Jonction)l;
                    j.getLien().setSauvegarde(save);
                    save.ajoutJonction(j.getLien());
                }
            }        
            session.saveOrUpdate(save);
            session.getTransaction().commit();
     
     
            Tableau.getInstance().ajoutInfo("Your panel has been correctly saved to the database as '"+message+"'.");
        }
    Comme vous pouvez le voir je met du hibernate directement dans ma methode, et pas dans une petite methode statique a part qui fait qu' un get par exemple ...
    Il me suffit de récupérer la sauvegarde en cours (s il y en a une), remove les composants (mon set de composants dans sauvegarde a : cascade="all-delete-orphan" donc il delete tout si on supprime), et ca roule nickel

    Merci pour votre aide

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

Discussions similaires

  1. Erreur Found shared references to a collection
    Par pcouas dans le forum Hibernate
    Réponses: 1
    Dernier message: 13/03/2019, 01h12
  2. [XL-2007] Erreur de représentation d'une date calculée
    Par gv33858 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2011, 11h24
  3. Réponses: 6
    Dernier message: 20/07/2007, 14h17
  4. Réponses: 9
    Dernier message: 16/05/2007, 12h00
  5. Réponses: 3
    Dernier message: 03/11/2006, 10h27

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