根据许多示例,可以像这样将 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
管理的所有实体在每个事务结束时都被分离。