EntityManager
定義上、スレッドセーフではありません。サーブレットの仕様によると、非分散環境で を実装していない場合、定義ごとにサーブレット インスタンスは 1 つしかSingleThreadModel
ありません。
したがって、Java EE でサーブレットのフィールドにEntityManager
スルーを挿入すると、スレッドセーフではありません。@PersistenceContext
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
Spring Bean のデフォルトのスコープはシングルトンですが、Springがトランザクションをバインドするために
EntityManager
使用するため、これはスレッドセーフであると言うのは正しいですか?ThreadLocal
EntityManager
上記のサーブレットの例は Spring でも有効ですか? まだスレッドセーフではありませんか?
この
ThreadLocal
アプローチは Spring 管理 Bean に対してのみ機能し、プレーンなサーブレットはその 1 つではありませんか?私が覚えている限りでは、 を注入するのはコンテナの責任
EntityManager
です。Glassfish Java EE 実装では、@PersistenceContext
as インジェクション ポイントを発見するのはアプリケーション サーバーでした。
春にはどのように見えますか?Spring Framework はそれらのアノテーションを発見する責任がありますか、それとも JPA 実装者の責任ですか?