web-dev-qa-db-ja.com

JPA 2.0のセッションとトランザクションの違いは何ですか?

私はJPA 2.0の研究を始めたばかりで、次のコードがあります。

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

私の問題は次のとおりです。セッションの使用とトランザクションの使用の違いを完全に理解しているかどうかはわかりません。数行で、それらの最大の違いを誰かに教えてもらえますか?よろしくお願いします!

39
user645579

銀行に行き、2つの小切手を入金し、小額を引き出します。

テラーが開くまで列に並んでいます。

初回入金を行います。
次に2番目です。
それからあなたはあなたの引き出しをします。

これで完了です。窓口係を離れます。

窓口に行くのは、セッションを作成するようなもので、今は銀行にいて、準備ができています。

各入金と引き出しは、それぞれに含まれる一連の作業であり、これらはお客様のトランザクションです。

仕事を終えて去るとき、あなたはあなたのセッションを閉じているか放棄しています。


つまり、本質的に、セッションには取引が含まれます。結局、銀行に行かなければ銀行預金を行うことはできません。

108
asawyer
em = SessionFactory.startSession();

JPAには、SessionもSessionFactoryもありません。 SessionFactoryは、JPAを使用する場合に使用すべきではないhibernate固有のインターフェースです(Hibernate独自のAPIを使用するか、JPAプロバイダーとしてHibernateを使用します。両方は使用しないでください)。

10

セッションは、データベースと対話するために使用するものです。

トランザクションは、セッションが内部で動作するための境界を指定するために使用されます。

基本的に、トランザクションは、セッションが一度に対話することのみを許可することにより、データベースの破損を防ぎます。 (データベースから読み取るトランザクションは多数ありますが、書き込むトランザクションは1つだけなので、それよりも少し複雑です。)

5
Jeremy

Hibernateでは、トランザクション管理は非常に標準的です。Hibernateによってスローされた例外はすべて致命的であることを覚えておいてください。トランザクションをロールバックし、現在のセッションをすぐに閉じる必要があります。

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