2017-06-29 7 views
0

私はSQLiteライブラリに接続するために、hibernate 5.2を使用しています。新しいSessionを作成し、Sessionを閉じた後にsession.createNativeQuery("My sql").executeUpdate()を使用しました。すべてうまく動作しますが、私はSessionを作成した後にTransactionを作成し、SQLの操作を実行し、Transactionをコミットし、Sessionを閉じるいくつかの例を見つけました。しかし、すべての例では、それらの中にTransactionを持っていると私のコードはそれなしで正常に動作します。我々はTransactionを使用する必要があるのはなぜHibernateでは、beginTransactionを使用しないとどうなりますか?

  • これは私は好奇心作ったのですか?

  • 私たちはしないとどうなりますか?
  • そして最も重要なのは、それを使用する必要があり、 ではありませんか?

我々は、トランザクションを使用する必要があるのはなぜ<property name="hibernate.connection.pool_size">1</property>

+1

これはJavaや休止状態で何もできません。トランザクションはdbのものです – Jens

答えて

0

hibernateとJDBCを関連付けると、トランザクションに関するヒントが得られます。

JDBCでは、接続を開くだけで作業を開始し、最後にコミットまたはロールバックする必要があります。

しかし、多くの異なる並列タスクがある場合、それらは互いに依存しているか独立している可能性があります。次に、各タスクを個別にコミット/ロールバックする必要があります。失敗した場合はロールバックします。

for example 
Big Task : 
    small task1 
    small task2 
    small task3 and many more 

小さなタスクが失敗すると大きなタスクがロールバックされます。これは多くのビジネス要件の1つになります。

JDBCでは、Connectionインターフェイスはcommit()メソッドとrollback()メソッドを提供しています。

jpa/hibernateでは、トランザクションインタフェースはcommit()メソッドとrollback()メソッドを提供しています。

したがって、1つのセッションに多くの依存トランザクションまたは独立トランザクションを設定できます。

以下

これはまた、あなたの What is the difference between a session and a transaction in JPA 2.0?

0

を使うのか? - >あなたがやっていることは単純な更新です。複数の更新があり、あなたのトランザクションにACIDの性質が必要な場合に、transaction mgmtが使用されます。

私たちはしないでしょうか? - >複数の更新ステートメントがあり、そのうちの1つが例外をスローすると、データが矛盾します。

+0

私は 'Transaction'なしでいくつかの' SQL'クエリを実行していました。それは間違って行くことができるかについてもう少し分かりますか? – Alyona

0

を助けるかもしれないorg.hibernate.Transaction

Allows the application to define units of work, while maintaining 
abstraction from the underlying transaction implementation (eg. JTA, JDBC). 

A transaction is associated with a Session and is usually 
initiated by a call to org.hibernate.Session.beginTransaction(). 
A single session might span multiple transactions since the notion of a session 
(a conversation between the application and the datastore) is of coarser granularity 
than the notion of a transaction. However, it is intended that there be at most 
one uncommitted transaction associated with a particular Session at any time. 

からのドキュメントであるのは、トランザクションが何であるかを定義してみましょう - 基本的には、作業の原子単位です。

CMT(コンテナ管理トランザクション) - あなたのための基本コンテナ(JTA)とBMT(ビーン)で管理されるCMT(コンテナ管理トランザクション) - トランザクション管理またはトランザクション境界の2つのタイプがあります管理されたトランザクション) - トランザクションの境界は、開発者自身によってプログラムによって管理されます。したがって、いずれの例でもtransactionが取得され、プログラムでコミットまたはロールバックされている場合(BMTの例)、トランザクションを管理するのは開発者の責任です。

明示的なトランザクション境界が表示されていない場合は、それはCMTであることを意味します。 これは非常に広範なテーマです - 私はあなたに助言しますread more.

関連する問題