Jpa EntityManager应该注入EJB吗?

Jpa EntityManager应该注入EJB吗?,jpa,ejb,Jpa,Ejb,我正在设计一个非常简单的web应用程序,其中包含一个REST web服务,该服务利用JPA与PostgreSQL数据库交互,并在TomEE中运行 我认为我不需要(或不希望)手动管理EntityManager的生命周期,因此我计划通过使用容器管理的EntityManager(可能是事务范围的)将这项工作转移到TomEE上 我认为我不需要(或不希望)手动管理容器管理的EntityManager所需要的JTA事务 最后,我计划使用DAO类将任何查询从RESTWeb服务的业务逻辑中分离出来 对于每个DA

我正在设计一个非常简单的web应用程序,其中包含一个REST web服务,该服务利用JPA与PostgreSQL数据库交互,并在TomEE中运行

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

我认为我不需要(或不希望)手动管理容器管理的EntityManager所需要的JTA事务

最后,我计划使用DAO类将任何查询从RESTWeb服务的业务逻辑中分离出来


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

每个DAO都应该是注入DB引用的无状态会话Bean

最好有一个GenericDAO通过EntityManager执行CRUD操作,以避免在EJB周围复制代码

通常,如果必须调用某个服务,我更愿意为每个Ws-Client创建一个EJB


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

将类设为EJB将为该类提供EJB所拥有和容器管理的一些特性,如事务管理、线程安全、安全性等

Ejb-In-Action一书中,建议使用一个简单的DAO类(而不是Ejb),它可以与EntityManager一起工作。DAO类不应该参与EJB的事务管理和其他特性,相反,应该始终有一个使用DAO类的EJB(使用@Inject注释),其他服务(如REST或SOAP web服务)应该调用使用我们需要的DAO的EJB


将所有类(如DAO类和实用程序类)转换为EJB,将给容器带来负担,并使管理所有EJB变得更加困难。

EntityManager已经提供了CRUD操作;为什么要用更多的(冗余的)代码来包装它?如果已经有了这个范围的DAO,那么一次又一次地注入EntityManager有什么意义?然后,通过将其注入任何地方,您都无法知道数据在哪里更改。。。您将没有一个单一的访问点