2017-08-07 15 views
0

私はSpringと連携し、hibernateとJPAを使用しています。メソッドのトランザクションコンテキストを提供するとき、そのメソッドの仕組みを知りたい。たとえば、私はいくつかのEntity Class Personを持っていました。 Person bobを作成し、そのエンティティを永続化しました。私がgetPersonByName("bob")に電話すると、取引が終了する前にbobを返すでしょうか?トランザクションの仕組みの理解

+0

永続性(保存)と取得(getPersonByName)が同じメソッドの一部であると言う場合、メソッドの実行が完了し、スレッドがメソッドを存在させると、オブジェクトが永続化されるため、戻りません。 永続性と検索が異なるトランザクション境界を持つ2つのメソッドで分離されている場合は、機能します。 –

答えて

0

短い答えは:の操作がどのように実装されているかによって異なります。

ロギングをオンにして、テストハーネスをセットアップして、自分で確認することができます。 these instructions to enable SQL queries and parameters printingに従うことができます。

2警告:

  1. 私たちは、書き込みを実行して読んだとき、我々はトランザクション境界内にあると仮定していますどのよう
  2. わからない(春@Transactionalデフォルトと方法(複数可)伝播レベルで) getPersonByName( "bob")は、(Spring-Data?またはJPQL/HQL?またはCriteria?またはfind()など)の下で動作します。

ハイバーネイト第1レベルキャッシュがデフォルトで有効になります。それはHibernate セッションにリンクされ、それによってフェッチされたすべてのエンティティはセッション内に格納されます。 その結果、書き込み直後の次の読み込みは、同じセッション内のDBにラウンドトリップしないでください。使用している場合を除き

今Hibernateの第一レベルのキャッシュがデフォルトで使用されていません。

  • のEntityManager#1のfind()を、その後のためには、getterメソッドを介した操作
  • その後のアクセスの関係を読みます上記からEntityManager#find()フェッチされたエンティティ
  • どのような種類のクエリでも使用されていません
関連する問題