12

Hibernate +Springを使用して以下をモデル化することは可能ですか?

  • オープンセッション
  • トランザクションを開始します
  • いくつかの作業を行います
  • 専念
  • トランザクションを開始します
  • その他の作業
  • 専念
  • セッションを閉じる

私は、セッションとトランザクションの存続期間の両方のスコープを実行するSpringTransactionTemplateを使用しています。

その理由は、ビジネスプロセスにいくつかの段階があり、各段階が完了した後にコミットしたい場合があるためです。ただし、同じ永続オブジェクトを引き続き使用したいと思います。トランザクションごとに個別のセッションがある場合、元のセッションが閉じられたため、一時的/切り離された例外が発生します。

これは可能ですか?

4

2 に答える 2

6

はい、Hibernate のセッションは複数のトランザクションを開始およびコミットできます。あなたがする必要があるのは、開いているセッションをどこかに保存してから再利用することです。Session はスレッドセーフなオブジェクトではないことに注意してください。ただし、同時実行性に問題がないことが確実な場合はTransactionSynchronizationUtils、セッションをスレッド リソースにバインドし、必要に応じてバインドを解除するために使用するだけです。ここで例を見つけるか、OSIV とその標準実装を参照してください。

これは非常に複雑なことです。問題が発生する可能性があるため、セッションをすぐに閉じて再利用しない方がはるかに簡単で望ましいです。

  • キャッシュ内のオブジェクトは自動的に削除されないため、セッションは OutOfMemory までサイズが大きくなります。
  • セッション内のオブジェクトは、汚れていない限りフラッシュされないため、別のユーザーによってオブジェクトが変更される可能性がますます高くなります。書き込み可能なオブジェクトを変更するのは 1 人のユーザーのみであることを確認してください。
  • いずれかのステップで何らかの例外が発生した場合は、セッションを確実に閉じる必要があります。セッション内で例外が発生した後、このオブジェクトは再利用できません。
  • トランザクションがロールバックされた場合、Spring によってセッションがクリアされるため、すべてのオブジェクトが切り離されます。少なくとも 1 つのトランザクションがロールバックされた場合は、すべて破棄してください。
于 2012-11-23T16:35:22.130 に答える
2

これは、OpenSessionInView パターンを使用して実現できます。Spring は、サーブレット環境で作業している場合に使用できる javax.servlet.Filter 実装を提供します (質問はそうは言っていません)。これにより、個々のトランザクションの間だけでなく、リクエストの間、Hibernate セッションが開いたままになります。

このクラスの Javadocは非常に包括的であり、出発点として適しています。

于 2012-11-23T16:30:21.773 に答える