没有EJB的Java EE DAO

时间:2013-05-06 05:55:18

标签: jpa ejb ejb-3.1

是否可以在Java EE环境中创建DAO,它使用JPA,但不需要是无状态bean?我问,因为我有大量的EJB,只是因为我在DAO中需要一些@Resources,即EntityManager等等。

作为一种在大型项目中简化DAO的方法,您会建议在DAO中使用完整的EJB(而不是简单的对象)是偶然的。

从其他EJB和servlet访问DAO。

2 个答案:

答案 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,它必须来自某个地方。

  1. 您使用InitialContext#lookup
  2. 在POJO中查找
  3. 你在POJO
  4. 的构造函数中传递它

    您必须注意InitialContext#lookup仅在父EJB已声明对实体管理器的依赖时才会起作用,即使它不使用它。

    值得麻烦的是判断电话。本地EJB非常便宜,并且拥有许多EJB对于app服务器来说不是问题。这更像是开发人员可理解的问题。 (见this other answer of me

    要问的另一个问题是whether you really need the DAOs。使用EJB 3,它们成为非常薄的逻辑层,值得思考利弊