根据许多示例,可以像这样将 EntityManager 注入(inject) @Stateless 或 @Singleton EJB:

@Stateless // or @Singleton
public class MyRepository {
   @PersistenceContext
   private EntityManager em;
   ...
}

EJB 3.1 规范规定依赖注入(inject)仅在构建时执行,因此 MyRepository 的所有调用者都将使用相同的 EntityManager 实例。 EJB 容器如何确保使用正确的 EntityManager 实例?

最佳答案

我的理解是 @Stateless bean 永远不会被两个客户端同时使用;如果容器需要为多个客户端提供服务,它只会创建同一个 bean 的更多实例。

至于 @Singleton bean,spec 表示默认情况下它们使用容器管理并发,其中容器使用方法 Lock s 并且如果单例繁忙,可能会以超时异常拒绝客户端。

编辑:此外,@PersistentContext 类型默认是事务范围的(规范中的 16.11.1.1),因此 EntityManager 管理的所有实体在每个事务结束时都被分离。

10-07 19:45
查看更多