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 :

les données ne sont pas mises à jour avec session.save, flush, refresh


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 18
    Points
    18
    Par défaut les données ne sont pas mises à jour avec session.save, flush, refresh
    Bonjour,
    j'utilise hibernate dans une application SWT,
    Quand je fais la mise à jour d'un objet, la base est bien modifiée mais quand j'interroge cet objet modifiéé à partir de l'application, l'objet conserve les anciennes donnees, lorsque je relance mon application je peux récupérer les données ajoutées. mais lorsque j'ajoute d'autres données je suis obligé chaque fois de relancer l'application pour les récupérer.
    j'utilise la classe HibernateUtil que j'ai trouvé sur developpez.com
    voici la classe HibernateUtil:
    package com.minosis.hibernate;
    import net.sf.hibernate.*;
    import net.sf.hibernate.cfg.*;
    public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
    try {
    // Crée la SessionFactory
    sessionFactory =
    new Configuration().configure().buildSessionFactory();
    } catch (HibernateException ex) {
    throw new RuntimeException("Problème de configuration : "
    + ex.getMessage(), ex);
    }
    }
    public static final ThreadLocal session = new ThreadLocal();
    public static Session currentSession()
    throws HibernateException {
    Session s = (Session) session.get();
    // Ouvre une nouvelle Session, si ce Thread n'en a aucune
    if (s == null) {
    s = sessionFactory.openSession();
    session.set(s);
    }
    return s;
    }
    public static void closeSession()
    throws HibernateException {
    Session s = (Session) session.get();
    session.set(null);
    if (s != null)
    s.close();
    }
    }

    voici un bout de code de mon application qui stocke les données :
    Session session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();
    Objet obj = new Objet();
    //bla bla bla
    session.save(obj);
    session.flush();
    session.refresh(obj);
    tx.commit();
    HibernateUtil.closeSession();

  2. #2
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Lorsque tu commit, automatiquement le flush est appelé donc ce n'est pas nécessaire de l'appelé explicitement. De plus, il n'est pas nécessaire de faire un refresh lorsque l'on fait une sauvegarde puisque tu possèdes déjà la bonne version.

    Voici un exemple pour sauvegarder et modifier un objet :

    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
     Session sess = factory.openSession();
     Transaction tx;
     try {
         tx = sess.beginTransaction();
     
         Foo objectToSave = new Foo("fooName");
         session.save(objectToSave);
     
         Foo objectToUpdate = session.get(Foo.class, 1L);
         objectToUpdate.setName("newName");
         session.update(objectToUpdate); // Pas nécessaire
     
         tx.commit();
     } catch (Exception e) {
         if (tx!=null) tx.rollback();
         throw e;
     } finally {
         sess.close();
     }

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Bonjour
    pour remedier a ce probleme , essaye de changer la visibilité de la sessionFactory dans la class HibernateUtil (rend la public).
    et aulieu de fermer la session par HibernatUtil.closesession() utilise HibernateUtil.sessionFactory.close()

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Merci darkxan,
    j'ai enlevé le flush et le refresh, même j'ai utilisé votre méthode pour modifier ou ajouter un objet, mais le problème reste le même : l'objet est bien ajouté mais je ne peux pas le récupérer que lorsque je redémarre mon application.
    l'application ne voit que les données stockées avant son démarrage!!!

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    comme je l'ai dit en haut, il faut fermer la sessionFactory non pas la session

  6. #6
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Tu fais comment pour "récupérer les données" ?


    En passant voici l'HibernateUtil "standard" :

    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
    package util;
     
    import org.hibernate.*;
    import org.hibernate.cfg.*;
     
    public class HibernateUtil {
     
        private static final SessionFactory sessionFactory;
     
        static {
            try {
                // Create the SessionFactory from hibernate.cfg.xml
                sessionFactory = new Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
     
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
     
    }
    Le code suivant effectue la même chose que celui que j'ai posté avant sauf que j'utilise HibernateUtil pour récupérer la fabrique de session. De plus, avec la méthode getCurrentSession, les sessions sont gérés par Hibernate. Il n'y a plus besoin de les fermer ou quoi que se soit.

    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
    Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
     Transaction tx;
     try {
         tx = sess.beginTransaction();
     
         Foo objectToSave = new Foo("fooName");
         session.save(objectToSave);
     
         Foo objectToUpdate = session.get(Foo.class, 1L);
         objectToUpdate.setName("newName");
         session.update(objectToUpdate); // Pas nécessaire
     
         tx.commit();
     } catch (Exception e) {
         if (tx!=null) tx.rollback();
         throw e;
     }
    PS : Pour laisser Hibernate géré les sessions, il faut mettre dans le fichier de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="current_session_context_class">thread</property>

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    merci pour votre aide,
    en fait le problème n'est pas dans la méthode de mise à jour c'est dans la méthode de chargement des nouveaux objets.
    j'ai changé la visibilité de sessionFactory et j'ai remplacer hibernateUtil.currentSession() par HibernateUtil.sessionFactory.openSession().
    ca marche, merci sa3d et à vous darkxan.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2014, 13h52
  2. Réponses: 3
    Dernier message: 12/03/2009, 15h11
  3. [LINQ to SQL] les valeurs de la table ne sont pas mises à jour
    Par Paul Van Walleghem dans le forum Accès aux données
    Réponses: 0
    Dernier message: 24/02/2009, 11h39
  4. Réponses: 5
    Dernier message: 22/10/2008, 17h40
  5. Les donnees ne sont pas mises à jour meme avec un refresh
    Par aymen007 dans le forum Hibernate
    Réponses: 5
    Dernier message: 11/10/2007, 16h20

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