是否应该将 EntityManager 注入到 EJB 中?

Should EntityManager be injected into an EJB?

我正在设计一个非常简单的 Web 应用程序,它具有 REST Web 服务,利用 JPA 与 PostgreSQL 数据库交互并在 TomEE 中运行。

我认为我不需要(或不希望)手动管理 EntityManager 的生命周期,因此我计划通过使用容器管理的 EntityManager(可能是事务范围)将这些琐事卸载到 TomEE 上。

我认为我不需要(或不希望)手动管理 Container Managed EntityManagers 所需的 JTA 事务。

最后,我计划使用 DAO classes 将任何查询与作为我的 REST Web 服务的业务逻辑分开。

对于每个 DAO class,我最好的选择是成为使用 @PersistenceContext 注释获取对 EntityManager 的引用的 EJB 吗?如果是这样,DOA 应该是什么类型的 EJB?我看到 examples/blogs 建议无状态、有状态、单例,甚至通过将 EntityManager 注入 Web 服务本身来完全忘记 DAO。处理此问题的最佳方法是什么?

每个 DAO 都应该是注入数据库引用的无状态会话 Bean。

最好让 GenericDAO 通过 EntityManager 执行 CRUD 操作,以避免围绕 EJB 复制代码。

如果必须调用某些服务,通常我更愿意为每个 Ws 客户端创建一个 EJB。

在提供 Ws 服务器的情况下,我总是注入我需要的 EJB 实例,而不是注入 EntityManager 实例,因为拥有单个访问点是一件好事。

创建一个 class EJB 将为 class 提供 EJB 具有且容器管理的一些功能,例如事务管理、线程安全、安全性等。

Ejb in Action一书中,据说建议使用与EntityManager 一起工作的简单DAO class(不是EJB)。 DAO classes 不应涉及事务管理和 EJB 具有的其他功能,相反,应该始终有一个使用 DAO class(使用 @Inject 注释)和其他服务(例如 REST 或SOAP Web 服务应该调用使用我们需要的 DAO 的 EJB。

将所有 classes,如 DAO classes 和 Utility classes 转换为 EJB,会给容器带来负担,并使管理所有 EJB 变得更加困难。