在没有 @PersistenceContext 的 Web 应用程序中使用 EntityManagerFactory 创建 EntityManager

Creating EntityManager using EntityManagerFactory in web application without @PersistenceContext

我正在使用 JPA 创建 Web 应用程序。我已经使用连接池 c3p0 配置了 Hibernate。
就我而言,无法使用 @PersistenceContext 注释注入 EntityManager。
在 Java EE 文档中,他们说使用 EntityManagerFactory 实例并发创建 EntityManager 实例是线程安全的。
因此,我在我的 Web 应用程序中为我的持久性单元使用一个静态 EntityManagerFactory 实例,并使用它创建 EntityManagers。
但是他们说EntityManagers不能并发使用(不是线程安全的)。
所以根据这个,我为每个 servlet 请求分别创建一个 EntityManager 实例,在同一个线程中使用它,然后处理它。
我可以这样做吗?

是的,顺便说一下 - 这正是 @PersistenceContext 要做的。它将:

  1. 调用 @Transactional 后创建 EntityManager(或者如果设置了 OpenEntityManagerInViewFilter - 调用过滤器时)
  2. 放在ThreadLocal变量中。这样该线程中的任何代码都可以访问它。
  3. 一旦执行超出 @Transactional 方法(或超出过滤器)- 它将关闭 EntityManager