2011-01-03 7 views
4

私はHibernateに関してしばらく読んでいましたが、Transactionに関する1つの概念を理解できないようです。HibernateトランザクションにSelect文を入れる

私が訪問したサイトによっては、Select文がこのようなトランザクションモードになっています。

public List<Book> readAll() { 
    Session session = HibernateUtil.getSessionFactory() 
      .getCurrentSession(); 
    session.beginTransaction(); 
    List<Book> booksList = session.createQuery("from Book").list(); 
    session.getTransaction().commit(); 
    return booksList; 
} 

いくつかのサイト上のが、それはSelect文にトランザクションの使用を提唱していません。私は1つは私が従うべき考えています

public List<Book> readAll() { 
    Session session = HibernateUtil.getSessionFactory() 
      .getCurrentSession(); 
    List<Book> booksList = session.createQuery("from Book").list(); 
    return booksList; 
} 

。取引はSelectに必要ですか?

答えて

7

を更新するために使用されます。

一般的なCRUDスタイルのWebアプリケーションでは、一般的なエンティティ設定では、バージョニングとオプティミスティックロックを使用します。 (hibernate annotation docs)アプリケーションがオプティミスティック・ロックを使用している場合、ダーティー読み取りはそれほど重要ではないため、トランザクションに選択を入れる必要はありません。

ダーティリードが受け入れられない場合、selectのトランザクションが適切です。このようなシナリオでは、ほとんどの場合、選択はある時点で完全な一貫性を必要とする一部のデータ変更と併せて行われます。

0

私が思い出す限り、休止状態にはすべてのトランザクションが必要です。トランザクションなしで実行し、失敗したかどうかを確認してください。

最近私は春とJPAで使用しています。注釈でトランザクションを開くことを忘れた場合、読み取り専用トランザクションが開始されます。しかし、それは春に特有のものかもしれません。

3

session.getTransaction().commit()は、それは、ユースケースに依存して、データベースに変更を持続し、データベースに変更された場合、インサートのようにそれを使用するか、または

+3

実際の言語を使用してください.Uは適切ではありません。 –

+2

@SeanPatrickFloydそして、あなたはどの言語で適切な言語を選んでいますか?私には、話す方法を人に話すことは、非構造的で無礼であるようです。私が本当に不適切と考えるような行動です。 –

+0

@mojojojo私は決定するのではなく、サイト運営者によって決定されました。 [英語は公式言語です](http://blog.stackoverflow.com/2009/07/non-english-question-policy/)、リート話は受け入れられない英語です。 –

1

ここでは、同じ結果を得る方法としてトランザクションを使用する選択肢があります。

データに何らかの変更を加えない限り、トランザクションは必要ありません。 DBと対話するときに常にトランザクションを持っていることを望む人もいますが、これはただの規則です。その場合、あなたはまた、あなたが

session.createCriteria(Book.class)の.list()を使用したほうが良いですsession.setFlushMode(FlushMode.NEVER);

を使用して読み取り専用トランザクションを使用することができます。

任意のリファクタリングが自動的にクエリを変更します。

関連する問題