2011-11-13 7 views
11

私は冬眠のlock methodを経由しています。この方法で私たちが達成しようとしているものは得られませんでした。私は、コードスニペットの上にしようとしたが、それはラインで、データベースから3 ドキュメントを人に読んでいないHibernateのsession.lockメソッドの目的は何ですか

p1 = (Person)session. get(Person.class,1);// person name is scott here 
// here peson name got update to henry by anothet thread 
session. lock(person, LockMode.READ) line 3 
// still name is henry too 

これはバージョンチェックを実行するために使用することができると述べています。

バージョンの確認方法や開発者のシナリオにどのような影響があるのか​​よくわかりません。

同様にsession.lock(person, LockMode.None)が実現するかどうかわかりません。ドキュメンテーションによると、LockMode.NONEは、一時的なインスタンスをセッションに単に再関連付けするために使用されます。

一時的なインスタンスをセッションに再関連付けすることが何を意味するのかわかりません。簡単なシナリオは大きな助けになるでしょうか?

答えて

11

異なるロックモードは、エンティティが複数のソースから同時に変更されたり読み取られたりするのを防ぐためのものです。詳しくはpessimistic lockingのドキュメントを参照してください。

はユーザーが 戦略をロック悩むのに多くの時間を費やすことを意図するものではない:データベースの分離レベルは、通常、必要に応じて、ロックの世話をするように私の経験では、これらはほとんど必要ありません。通常は、JDBC接続の分離レベルを指定して、データベースにすべての作業を行わせるだけで十分です。 ただし、上級ユーザーは、排他的なペシミスティック・ロック を取得したり、新しいトランザクションの開始時にロックを再取得することができます。 「セッションで一時的なインスタンスの再関連付け」については

(私は実際に彼らが分離されたインスタンスを意味すると思いますか?)、以下の絵(Hibernate entity lifecycleを)考えてみます。

Hibernate entity lifecycle

これは説明ですHibernate community documentationから:

0123:

Hibernateは次のオブジェクトの状態を定義し、サポートしています

  • Transient - new演算子を使用して をインスタンス化したばかりのオブジェクトで、Hibernate セッションに関連付けられていない場合、オブジェクトは一時的です。データベースには永続的な表現はなく、識別子値は に割り当てられていません。アプリケーションに 参照がもう保持されていない場合、一時インスタンスは がガベージコレクタによって破棄されます。オブジェクトを に永続化させるには、Hibernate Sessionを使用してください(そして、Hibernateは、この遷移のために が実行される必要のあるSQL文を処理します)。
  • 永続性 - 永続的な インスタンスは、データベース内の表現と識別子値を持ちます。 これは保存またはロードされたばかりかもしれませんが、セッションのスコープ内に定義されているのは です。 Hibernateは、永続状態のオブジェクトを に対して行った変更を検出し、作業単位が完了したときに状態を データベースと同期させます。開発者は 手動UPDATEステートメントまたはDELETEステートメントを実行しません。 を一時的にする必要があります。
  • デタッチ - デタッチされたインスタンスは、 が永続化されているがそのセッションが閉じられているオブジェクトです。もちろん、オブジェクトは への参照が有効です。この状態では、切り離されたインスタンス も変更される可能性があります。デタッチされたインスタンスは後で新しいセッションに に再接続することができ、それを(そしてすべての の変更を)永続化します。この機能により、ユーザーの思考時間を必要とする長時間作業単位のプログラミング モデルが有効になります。我々は というアプリケーショントランザクション、すなわちユーザの の観点から作業単位と呼ぶ。
関連する問題