Jakarta ee 将JPA与现有J2EE体系结构集成

Jakarta ee 将JPA与现有J2EE体系结构集成,jakarta-ee,jpa,persistence,weblogic,entitymanager,Jakarta Ee,Jpa,Persistence,Weblogic,Entitymanager,我希望从那些成功地将JPA与遗留类型产品集成的人那里得到一些反馈。最近,我们的软件团队一直在考虑将JPA功能添加到J2EE软件堆栈中的想法。JPA的强大和灵活性给我们留下了深刻的印象,但我们很难将其“干净地”与当前的体系结构集成。我们在网上找到的大多数JPA示例都太简单,无法应用于我们当前的体系结构 我们当前的架构是嵌套的。从面向用户的“托管”bean到数据库层,通常有7-8层(有时更深)。我们的问题是@PersistenceContext只能在ManagedBeans上使用。我们不想让所有这些

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

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

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

如果能从过去做过类似事情的人那里得到反馈,那就太好了。在开发的这个阶段,根本不可能重新构建体系结构。有没有一个好的方法来做到这一点,或者我们正在试图把一个方形的钉子装进一个圆形的孔

提前感谢,

Weblogic 12.1.2


JPA2.0-EclipesLink

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

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
,这意味着代码中只有一个点我需要担心调用
EntityManager
上的
close()
。因此,它相当接近容器管理的持久性,没有定制的容器管理

我真的无法评论这种方法在热(重新)部署方面有多好(我在实践中很少进行热部署,因为我注意到,即使其他一切都按预期工作,热部署也会消耗
PermGen
空间),尽管我没有看到任何具体的问题。我也看不出有什么理由

如果您的容器/web框架试图不惜一切代价隐藏
HttpServletRequest
,那么这种方法可能有点笨拙(并且/或者您必须重新编写它,以使用框架提供的任何请求代理)。如果您使用模拟对象进行大量测试,显然静态实用程序类会使测试变得更加困难。但实际上,上面的代码在几个不同的应用程序中都非常有用