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 :

Comportement étrange de Hibernate avec le persist au sein d'une transaction


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 66
    Points
    66
    Par défaut Comportement étrange de Hibernate avec le persist au sein d'une transaction
    J'étudie Hibernate et je réalise des petits TP. Actuellement j'en suis à essayer de comprendre la différence entre persist et save. Si j'ai bien compris, le persist n'affecte pas forcéement immédiatement un id à l'objet à persister mais surtout il est défini dans le cadre d'une transaction.

    Or quand j'exécute le code suivant, j'ai mon objet qui est persisté quoi qu'il arrive. Y a-t-il quelque chose que je n'aurais pas comprise :

    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
    public class MainApp {
     
        @Transactional
        public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
     
            Imagerie imagerie = new Imagerie();
            imagerie.setNom("toto");
            session.save(imagerie);
            session.flush();
            if (1 == 1) { // On lève une exception avant le commit et à l'intérieur d'une transaction
                throw new NullPointerException("");
            }
            session.getTransaction().commit(); // ce code est inatteignable 
    // L'entité "Imagerie" est tout de même persistée en base ! 
        }
    }

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Bonjour.
    Si tu enlèves "session.flush();" que se passe-t-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void flush()
               throws HibernateException
    Force this session to flush. Must be called at the end of a unit of work, before commiting the transaction and closing the session (depending on flush-mode, Transaction.commit() calls this method).
    Flushing is the process of synchronizing the underlying persistent store with persistable state held in memory.

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    @Transactional sur la méthode main, static, vraiment ? ^^

    @Transactional est un marqueur à appliquer sur les méthodes d'un service Spring. Il permet à spring d'injecter le code nécessaire pour démarrer, et commiter ou rollbacker une transaction, à l'entrée et à la sortie d'une méthode. Il n'aura strictement aucun effet sur tout ce qui n'est pas managé par Spring, et donc, a fortiori, sur aucune méthode static (même si elle faisait partie d'un bean spring).

    De plus, dès qu'on met @Transactional, on entre dans un mode de gestion des transactions déclaratif (par opposition à la gestion impérative). Et donc, il ne servira à plus rien (et même, il est contre-productif voir complètement faux) de gérer les transactions manuellement (plus aucun call à session.beginTransaction).

    Pour finir, dans une gestion impérative des transactions, il est de la responsabilité du programmeur de rollbacker la transaction en cas d'erreur: donc, il faut un bloc catch qui implémente un rollback de la transaction.

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 16h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 20h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 22h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 10h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 12h23

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