是否可以在Java EE环境中创建DAO,它使用JPA,但不需要是无状态bean?我问,因为我有大量的EJB,只是因为我在DAO中需要一些@Resources,即EntityManager
等等。
作为一种在大型项目中简化DAO的方法,您会建议在DAO中使用完整的EJB(而不是简单的对象)是偶然的。
从其他EJB和servlet访问DAO。
答案 0 :(得分:7)
可以(但不建议)将EntityManager
注入其他类型的bean(例如CDI托管bean)以及UserTransaction
,然后手动管理您的交易。
在Java EE 7中,JTA 1.2为EJB提供了与声明性事务相关的CDI兼容扩展,但目前尚未发布任何Java EE 7 AS。
在我看来,为DAO提供完整的EJB(而不是简单的对象)是过分的。
你为什么这么认为? “完整”EJB可能比任何其他替代品更轻量级,并且几乎肯定比基于EntityManager
的任何家庭烹饪的东西更轻量级。
不要忘记EJB bean自动共享资源,注入点只能获取代理。如果您主要使用无状态EJB bean,那些代理类似于URL,而不是“真正的”bean。这使得无状态和本地EJB bean非常轻量级地注入。
意思是,如果你有一个给定的服务,你注入(比方说)10个DAO,每个注入EntityManager
,并且在给定的调用期间调用3个DAO,那么实际只使用3个bean,只有1个EntityManager
个实例。它真的很有效率。
答案 1 :(得分:2)
你可以实现DAO,因为你想要POJO。但是DAO需要EntitManager
,它必须来自某个地方。
InitialContext#lookup
您必须注意InitialContext#lookup
仅在父EJB已声明对实体管理器的依赖时才会起作用,即使它不使用它。
值得麻烦的是判断电话。本地EJB非常便宜,并且拥有许多EJB对于app服务器来说不是问题。这更像是开发人员可理解的问题。 (见this other answer of me)
要问的另一个问题是whether you really need the DAOs。使用EJB 3,它们成为非常薄的逻辑层,值得思考利弊