在没有 @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
要做的。它将:
- 调用
@Transactional
后创建 EntityManager
(或者如果设置了 OpenEntityManagerInViewFilter
- 调用过滤器时)
- 放在ThreadLocal变量中。这样该线程中的任何代码都可以访问它。
- 一旦执行超出
@Transactional
方法(或超出过滤器)- 它将关闭 EntityManager
我正在使用 JPA 创建 Web 应用程序。我已经使用连接池 c3p0 配置了 Hibernate。
就我而言,无法使用 @PersistenceContext 注释注入 EntityManager。
在 Java EE 文档中,他们说使用 EntityManagerFactory 实例并发创建 EntityManager 实例是线程安全的。
因此,我在我的 Web 应用程序中为我的持久性单元使用一个静态 EntityManagerFactory 实例,并使用它创建 EntityManagers。
但是他们说EntityManagers不能并发使用(不是线程安全的)。
所以根据这个,我为每个 servlet 请求分别创建一个 EntityManager 实例,在同一个线程中使用它,然后处理它。
我可以这样做吗?
是的,顺便说一下 - 这正是 @PersistenceContext
要做的。它将:
- 调用
@Transactional
后创建EntityManager
(或者如果设置了OpenEntityManagerInViewFilter
- 调用过滤器时) - 放在ThreadLocal变量中。这样该线程中的任何代码都可以访问它。
- 一旦执行超出
@Transactional
方法(或超出过滤器)- 它将关闭 EntityManager