2

インスタンスを含む計算では@Entity、1つのスレッドAが新しいスレッドBを作成します。スレッドAはエンティティへの参照を保持し、この参照をスレッドBに渡します。

スレッドAは、単一のHTTPリクエストの処理、リポジトリ内のエンティティの検索、およびHTTPレスポンスの送信を処理します。
スレッドBは、そのエンティティに関連する長時間実行される計算を処理します。
Q:なぜ2つのスレッドを選択したのですか?A:長時間実行されるHTTP要求/応答サイクルは必要ありません。代わりに、ユーザーに「計算が開始されました」とすばやく応答する高速HTTP要求/応答サイクルが必要です。

スレッドAからエンティティにアクセスすることは問題なく機能します。
ただし、スレッドBからエンティティにアクセスすることはできません。エンティティ関係(Hibernateからデータを遅延フェッチする必要があります)にアクセスしようとすると、例外が発生しますorg.hibernate.LazyInitializationException: could not initialize proxy - no Session

JPA / Hibernateセッションのスコープは単一のスレッド(つまり、そのセッションを作成するスレッド(私の場合はスレッドA、これはエンティティのリポジトリをクエリするスレッド))ですか?この場合、複数のスレッドから同じエンティティを操作できるように、複数のスレッドにHibernateセッションを共有させるにはどうすればよいですか?

私のエンティティの反発動作を「積極的な読み込み」に変更することは、実行可能な解決策ではありません。PersistenceContextまた、ドメインクラス/エンティティに影響を与えないソリューションを探しています(たとえば、ドメインクラス内またはEntityManagerドメインクラス内でデタッチされたエンティティを再接続したくない場合などです。

4

1 に答える 1

1

セッションのJavadocによると、セッションは複数のスレッドで使用されることを意図していません。切り離されたエンティティで同時に作業する前に
、スレッド A のセッションからオブジェクトを切り離す必要があります。データベースからまだ読み取られていない、必要な遅延プロパティがある場合evictはスローされることに注意してください。 完了したら、エンティティをセッションに再アタッチして保存するために呼び出す必要があります。org.hibernate.LazyInitializationException
merge

于 2013-02-16T16:31:22.500 に答える