2016-08-10 4 views
1

、: 1.セッション 2.セッションおよびトランザクションのJava休止状態で

  • 4.閉じるセッショントランザクション 3.完了のトランザクションを開始しますたとえば

    私は学生のリストを取得したい場合:学生

    を挿入

    public static List<Student> getStudentList() 
    { 
        List<Student> l = null; 
        Session session = HibernateUtil.getSessionFactory().openSession(); 
        try { 
         String hql = "from Student"; 
         Query query = session.createQuery(hql); 
         l = query.list(); 
        } catch (HibernateException ex) { 
         //Log the exception 
         System.err.println(ex); 
        } finally { 
         session.close(); 
        } 
        return l; 
    } 
    
  • public static boolean addStudent(Student s) 
    { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    
    if (... /* check if student is already exists*/) 
    { 
        return false; 
    } 
    Transaction transaction = null; 
    
    try { 
        transaction = session.beginTransaction(); 
        session.save(s); 
        transaction.commit(); 
    } catch (HibernateException ex) { 
        //Log the exception 
        transaction.rollback(); 
        System.err.println(ex); 
        } finally { 
         session.close(); 
    } 
    return true; 
    } 
    

なぜgetStudentList()にトランザクションがないのですか?事前にありがとう

答えて

1

このハイバネートarticleは、トランザクション内で明示的に実行されないSELECT操作の動作を説明しています。

次の例は記事に記載されていますが、クエリの例にも当てはまります。

セッションセッション= sessionFactory.openSession();
session.get(Item.class、123l);
session.close();

  1. 新しいセッションが開きます。この時点でデータベース接続は得られません。
  2. get()を呼び出すと、SQL SELECTがトリガーされます。セッションは、接続プールからJDBC接続を取得するようになりました。デフォルトでは、HibernateはsetAutoCommit(false)を使ってこの接続の自動コミットモードを直ちにオフにします。これにより、JDBCトランザクションが効果的に開始されます。
  3. SELECTはこのJDBCトランザクション内で実行されます。セッションは閉じられ、接続はプールに戻され、Hibernateによって解放されます。 - HibernateはJDBC接続でclose()を呼び出します。コミットされていないトランザクションはどうなりますか?

この質問に対する答えは、「それは依存します」です。JDBC仕様では、接続上でclose()が呼び出されたときに保留中のトランザクションについては何も言及していません。何が起きるかは、ベンダーがどのように仕様を実装するかによって決まります。たとえば、Oracle JDBCドライバでは、close()を呼び出すとトランザクションがコミットされます。 JDBC Connectionオブジェクトが閉じられ、リソースがプールに返されると、他のほとんどのJDBCベンダーは同じルートを使用して、保留中のトランザクションをロールバックします。 明らかに、これはSELECT [...]の問題ではありません

上記の例を拡張すると、問題が発生する可能性があります。

Session session = sessionFactory.openSession(); 
Item item = session.get(Item.class, 123l); 
item.setPrice(10); 
session.close(); 

Itemのための新しい価格が永続化されているかどうか今では、JDBCドライバに依存します。

SELECTオペレーションでトランザクションを開始したりコミットしたりすることは、データベースが変更されていない限り、JDBCドライバがトランザクションをロールバックする場合でも無視できます。

しかし、とにかく私は、誤解や問題を避けるために、いかなる操作でもトランザクションを使用することを強くお勧めします。