我们最近在我工作的公司经历了类似的经历。可悲的是,我们找不到该过程的任何明确指南。我们在这里和那里发现的是部分指南。我不确定其他人是如何处理这个问题的,我很想看看这里是否发布了任何其他解决方案。但是,我可以告诉您我们是如何处理它的,并希望您能从我们的经验中学习。
从一开始,我们就知道我们希望能够控制我们将使用哪个版本的 Spring(在我们的例子中是 Hibernate)。自然,NetBeans IDE 中内置的版本有些过时了,我们希望在开发服务器代码时能够使用最先进的版本。
我们最终创建了两个独立的项目:一个用于我们的服务器代码(我们的服务、DAO 和域实体),另一个用于我们的客户端应用程序。然后,我们将服务器代码打包,将 jar 及其依赖项复制到客户端项目,并将这些 jar 列为客户端代码中的依赖项。我们在 NetBeans 项目中创建了一个名为 SpringHibernate 的模块,它包含这些 jars,并且几乎所有其他模块都依赖于它。
我建议创建一个 ant 任务,在将 jar 文件添加到 NetBeans 项目之前删除它们的版本号。这使您可以无缝地更新服务器代码中的 jar,而无需客户端代码知道其中的区别。 (当您开始删除和重新添加 jar 时,NetBeans 可能会有点挑剔。)
第一个主要任务是创建一个 Util 类,它可以加载您的 applicationContext.xml 并从上下文中返回 bean。该过程概述了here。
我们遇到的主要障碍之一是创建 Sessions(或 JPA 术语中的 EntityManagers)。 NetBeans 平台是一个高度线程化的环境,而 EntityManager 被设计为仅在单个线程上工作。为了解决这个问题,我们选择了 Open Session In View 路线*。我们创建了一个类,可以将相同的 EntityManager 加载到任何请求它的线程中。然后,我们创建了服务的客户端代理,在调用实际的 Spring 托管服务之前将 EntityManager 加载到其线程中。创建客户端代理服务的额外好处是可以通过@ServiceProvider 注解使用Lookup.getDefault().lookup(Service.class) 找到它们。
然后您应该 create a custom LifeCycleManager 在应用程序关闭时拆除并关闭您的 EntityManager 和 EntityManagerFactory。
我希望这会有所帮助!
*我知道 Open Session in View 一直是 labeled 作为反模式,但只要您了解与之相关的问题,您就可以缓解这些问题(通过缓存不太可能随时间变化的对象,使智能数据库调用等)。另外,我记得在我们的研究过程中,我们发现了 Gavin King 的一篇论坛帖子,指出 Open Session In View 是客户端应用程序的推荐路径。当然,我现在找不到该帖子,但它在某处。