web-dev-qa-db-fra.com

Quelle est la différence entre une session et une transaction dans JPA 2.0?

Je viens de commencer mes études JPA 2.0, et j'ai ce morceau de code:

em = SessionFactory.startSession();
tx = em.getTransaction();

Mon problème est: je ne suis pas sûr de bien comprendre la différence entre l'utilisation d'une session et l'utilisation d'une transaction. En quelques lignes, quelqu'un peut-il me dire les plus grandes différences entre eux? Merci !

39
user645579

Vous vous rendez à la banque pour déposer 2 chèques et retirez une petite somme.

Vous restez donc en ligne jusqu'à ce qu'un caissier s'ouvre.

Vous effectuez votre premier dépôt.
Puis votre deuxième.
Ensuite, vous effectuez votre retrait.

Maintenant que vous avez terminé, vous quittez la ligne de guichetier.

Accéder au caissier, c'est comme créer votre session, maintenant vous êtes à la banque, prêt à travailler.

Chaque dépôt et retrait est leur propre ensemble de travaux, ce sont vos transactions.

Lorsque vous avez terminé votre travail et que vous partez, vous fermez ou abandonnez votre session.


Donc, en substance, une session contient vos transactions, après tout, vous ne pouvez pas faire de dépôt bancaire si vous n'allez jamais à la banque, n'est-ce pas?

108
asawyer
em = SessionFactory.startSession();

Dans JPA, il n'y a ni Session ni SessionFactory. SessionFactory est une interface spécifique à Hibernate que vous ne devez pas utiliser si vous utilisez JPA (utilisez la propre API d'Hibernate ou utilisez Hibernate comme fournisseur JPA, mais pas les deux.)

10
Sean Patrick Floyd

Une session est ce que vous utilisez pour interagir avec la base de données.

Une transaction est utilisée pour spécifier les limites de la session à opérer.

Essentiellement, les transactions empêchent la base de données d'être corrompue en autorisant uniquement une session à interagir avec elle à un moment donné. (C'est un peu plus compliqué que cela, car vous pouvez avoir plusieurs transactions en cours de lecture dans la base de données, mais une seule transaction en cours d'écriture.)

5
Jeremy

Dans Hibernate, la gestion des transactions est assez standard, rappelez-vous simplement que toutes les exceptions levées par Hibernate sont fatales, vous devez annuler la transaction et fermer immédiatement la session en cours.

Voici un modèle de transaction Hibernate:

    Session session = null;
    Transaction tx = null;

    try{
        session = HibernateUtil.getSessionFactory().openSession();
        tx = session.beginTransaction();
        tx.setTimeout(5);

        //doSomething(session);

        tx.commit();


    }catch(RuntimeException e){
        try{
            tx.rollback();
        }catch(RuntimeException rbe){
            log.error("Couldn’t roll back transaction", rbe);
        }
        throw e;
    }finally{
        if(session!=null){
            session.close();
        }
    }
3
user4341816