【问题标题】:Utility class : EJB Session or Simple Object?实用程序类:EJB 会话还是简单对象?
【发布时间】:2017-03-05 14:54:06
【问题描述】:

我正在开发一个基于 EJB 的应用程序,其中我有 JpaUtility 实用程序类。要实现它,我有两个选择:

  • 创建一个简单的对象JpaUtility,我在里面放了getAll方法 静态,允许从类名 (JpaUtility.getAll) 进行访问

/* 简单对象实用程序 */

public class JpaUtility
{
public static List<T> getAll(EntityManager manager, Class<T> clazz) {
        return manager.createQuery("...."); }
}
  • 创建一个包含getAll方法的EJB-Session,然后注入并使用 需要时。

/* EJB 实用程序 */

@Stateless
public class JpaUtility
{
@PersistentContext
private EntityManager manager;
public static List<T> findAll(Class<T> clazz) {
        return manager.createQuery("...."); }
}

问题是:哪一个性能最好?简单对象还是 EJB 无状态?换句话说,与简单对象相比,EJB 提供了什么?

【问题讨论】:

  • 你也测试过吗?您需要考虑您将以一种或另一种方式将 PersistenceContext 注入您的代码,因此您需要从设计角度或性能角度确定帮助程序类是否有用。测试一下看看

标签: java jakarta-ee ejb pojo stateless


【解决方案1】:

您要完成的工作看起来像“通用模式 DAO”,那里有许多“现成”的实现。来自 AdamBien:"Generic CRUD Service" 更详细,消除了对自定义解决方案的需求,并接近 Apache DeltaSpike 的 Spring 模板的简单性:DeltaSpike Data module

现在回到您最初的问题,EJB 或 POJO,就您而言,在 EE 容器中工作时,实体管理器的使用必须是“容器管理的”,因此您的“正确”选项是 EJB 或 CDI,但不是简单的非托管 POJO。

【讨论】:

  • 感谢您的回答。为什么你说“正确”选项? (我同意你的观点,但是如何争论这个选择呢?)
  • 如果您使用例如非托管 POJO,那么您应该通过实体管理器工厂获取实体管理器,如果您需要将其与事务上下文相关联,则需要额外的工作。 EJB 和 CDI bean 使您免于编写可能导致更多错误的额外代码的痛苦。
  • 使用 EJB/CDI 的主要优势是容器给定的事务上下文。可以吗?
  • 只有一个,例如无状态 EJB 的另一个是提供线程安全的每个代理模式的线程,另一个是单例方法的自动锁定等等......
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多