3

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

作为在大型项目中简化 DAO 的一种方法,您会推荐什么,在我看来,为 DAO 拥有完整的 EJB(而不是简单的对象)似乎是过度的。

DAO 既可以从其他 EJB 也可以从 servlet 访问。

4

2 回答 2

7

可以但不推荐将EntityManager与 a 一起注入其他类型的 bean(例如 CDI 管理的 bean)UserTransaction,然后手动管理您的事务。

在 Java EE 7 中,JTA 1.2 为声明式事务提供了与 CDI 兼容的扩展,就像 EJB 一样,但目前还没有任何 Java EE 7 AS 的最终版本。

在我看来,为 DAO 提供完整的 EJB(而不是简单的对象)是多余的。

为什么你这么想?“完整的”EJB 可能比任何其他替代方案都更轻量级,而且几乎可以肯定比任何基于EntityManager.

不要忘记 EJB bean 会自动共享它们的资源,并且注入点只会获得代理。如果您主要使用无状态 EJB bean,那么这些代理类似于 URL,而不是“真正的”bean。这使得无状态和本地 EJB bean 的注入非常轻巧。

这意味着,如果您有一个给定的服务,您在其中注入(例如)10 个 DAO,每个都有一个注入的 DAO EntityManager,并且在给定的调用期间调用了 3 个 DAO,那么实际上只使用了 3 个 bean,并且只有 1 个EntityManager实例。它确实是相当有效的。

于 2013-05-06T06:44:33.963 回答
2

你可以按照你想要的 POJO 来实现 DAO。但是 DAO 需要一个EntitManager必须来自某个地方的东西。任何一个

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

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

是否值得麻烦是一个判断电话。本地 EJB 非常便宜,拥有多个 EJB 对应用服务器来说不是问题。这更多的是开发人员的可理解性问题。(请参阅我的另一个答案

另一个要问的问题是你是否真的需要 DAO。有了 EJB 3,它们就变成了非常薄的逻辑层,值得深思利弊

于 2013-05-06T06:41:59.060 回答