Jakarta ee 将JPA与现有J2EE体系结构集成
我希望从那些成功地将JPA与遗留类型产品集成的人那里得到一些反馈。最近,我们的软件团队一直在考虑将JPA功能添加到J2EE软件堆栈中的想法。JPA的强大和灵活性给我们留下了深刻的印象,但我们很难将其“干净地”与当前的体系结构集成。我们在网上找到的大多数JPA示例都太简单,无法应用于我们当前的体系结构 我们当前的架构是嵌套的。从面向用户的“托管”bean到数据库层,通常有7-8层(有时更深)。我们的问题是@PersistenceContext只能在ManagedBeans上使用。我们不想让所有这些数据访问器类都成为MangedBeans,因为这将导致几十个甚至数百个bean。更不用说你必须为中间的7-8层中的每一层进行注入,使它们也都是bean。这简直是失控了 我们尝试过的一个想法可能是一个坏主意,就是使用一个可以跟踪注入的EntityManager的单例,然后在任何层访问它。然而,我们在重新部署应用程序时看到了这方面的问题(我假设是由于过时的类) 如果能从过去做过类似事情的人那里得到反馈,那就太好了。在开发的这个阶段,根本不可能重新构建体系结构。有没有一个好的方法来做到这一点,或者我们正在试图把一个方形的钉子装进一个圆形的孔 提前感谢, Weblogic 12.1.2Jakarta 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上使用。我们不想让所有这些
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
,那么这种方法可能有点笨拙(并且/或者您必须重新编写它,以使用框架提供的任何请求代理)。如果您使用模拟对象进行大量测试,显然静态实用程序类会使测试变得更加困难。但实际上,上面的代码在几个不同的应用程序中都非常有用