【问题标题】:Integrating JPA with an existing J2EE architecture将 JPA 与现有 J2EE 架构集成
【发布时间】:2014-03-22 05:35:04
【问题描述】:

我希望从那些成功地将 JPA 与遗留类型产品集成的人那里得到一些反馈。最近,我们的软件团队一直在考虑将 JPA 功能添加到我们的 J2EE 软件堆栈的想法。 JPA 的强大功能和灵活性给我们留下了深刻的印象,但很难将它“干净”地与当前架构集成。我们在网上找到的大多数 JPA 示例都过于简单,无法应用于我们当前的架构。

我们当前的架构是深度嵌套的。从面向用户的“托管”bean 到数据库层通常有 7-8 层(有时更深)。我们的问题是 @PersistenceContext 只能在 ManagedBeans 上使用。我们不想将所有这些数据访问器类都设为 MangedBean,因为这将导致数十个甚至数百个 bean。更不用说您必须为中间的 7-8 层中的每一层进行注入,使它们也都是 bean。这简直失控了。

我们尝试过的一个想法(这可能是个坏主意)是拥有一个可以跟踪注入的 EntityManager 的单例,然后在任何层访问它。但是,我们在重新部署应用程序时看到了这个问题(我假设是由于过时的类)。

很高兴能从过去做过类似事情的任何人那里获得反馈。在这个发展阶段重新架构是完全不可能的。有什么好的方法可以做到这一点,还是我们试图在圆孔中安装一个方形钉?

提前致谢,

Weblogic 12.1.2

JPA2.0 - EclipesLink

【问题讨论】:

    标签: jakarta-ee jpa persistence weblogic entitymanager


    【解决方案1】:

    我做了一些类似于您建议的“单例”方法的事情(尽管没有使用依赖注入或容器管理的单例)。我所做的大致是:

    public static EntityManager getEntityManager(HttpServletRequest request) {
        //first, check for a cached instance
        EntityManager cachedEm = (EntityManager)request.getAttribute(Constants.ENTITY_MANAGER_REQUEST_KEY);
        if (cachedEm != null) {
            if (! cachedEm.isOpen()) {
                //somebody has closed the cached EntityManager; discard it and get a new one
                request.removeAttribute(Constants.ENTITY_MANAGER_REQUEST_KEY);
                return getEntityManager(request);
            }
            return cachedEm;
        }
    
        //no cached instance, get a fresh one from the factory and cache it for this request
        cachedEm = factory.createEntityManager();
        request.setAttribute(Constants.ENTITY_MANAGER_REQUEST_KEY, cachedEm);
        return cachedEm;
    }
    

    所以我有一个静态可访问的实用程序函数,可用于获取针对当前请求的EntityManager。这确保了在正常情况下,与给定 HTTP 请求相关的所有处理都将使用单个 EntityManager(还有其他方法用于创建临时/独立 EntityManager 实例,对于少数情况所以是有用和适当的)。包含此实用程序函数的类不是容器管理的;它只是一个普通的静态实用程序类。

    我还对其进行了接线,以便监督进程的 Spring 控制器在呈现/写入响应后自动关闭请求的 EntityManager,这意味着代码中只有一个点我需要担心调用 @ 987654326@EntityManager。因此,它相当接近于容器管理的持久性,无需定制容器管理。

    无法真正评论这种方法在热(重新)部署方面的表现如何(我在实践中很少进行热部署,因为我注意到它们往往会烧毁PermGen 空间,即使其他一切工作正常它应该),虽然我还没有看到任何具体的问题。我也看不出有什么理由。

    如果您的容器/Web 框架是不惜一切代价试图将HttpServletRequest 隐藏在您面前的框架之一,那么这种方法可能有点笨拙(并且/或者您必须重新设计它才能使用任何东西请求代理你的框架给你)。而且,如果您使用模拟对象进行大量测试,显然静态实用程序类会使这变得更加困难。但实际上,上面的代码在几个不同的应用程序中为我提供了很好的服务。

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多