【问题标题】:Eclipselink : How do you get the EntityManager in each bundle?Eclipselink:如何在每个捆绑包中获取 EntityManager?
【发布时间】:2011-03-15 08:05:21
【问题描述】:

我想知道在每个 Bundle 中都有一个 EntityManager 的好方法。或者如何在 OSGi 程序中正确使用 JPA。

实际上,我有一个加载persistence.xml 文件并实例化EntityManager 的主包。之后,我的主包通过服务将实体管理器的实例提供给其他包。所以我使用了 Equinox 服务的强大功能,我确信它必须存在另一种解决方案才能在每个捆绑包中获取一个 EntityManager!

您知道另一种解决方案吗?还是实现这一目标的正确方法?

【问题讨论】:

    标签: jpa persistence osgi eclipselink


    【解决方案1】:

    您是否看过 EclipseLink wiki 上的 JPA OSGi 示例:http://wiki.eclipse.org/EclipseLink/Examples/OSGi

    EclipseLink 是为 OSGi 打包和设计的。 Eclipse Gemini JPA 即将推出,它通过新的 OSGi JPA 标准增加了对使用 EclipseLink 的支持(www.eclipse.org/gemini/jpa,Stackoverflow 不允许我发布完整的 URL)。我认为您会喜欢 Gemini JPA,因为该规范非常面向服务,并且可以通过任何捆绑包中的服务获得 EntityManagerFactory。我们正在努力实现 Gemini JPA 的初始里程碑,所以现在我会坚持使用 EclispeLink OSGi。

    --肖恩

    【讨论】:

    • 谢谢。但是,您给我的网站没有描述如何在每个捆绑包中包含一个 EntityManager 实例...您能帮帮我吗?或者给我一个例子?非常感谢
    【解决方案2】:

    如果您正在编写桌面应用程序(因此无法访问容器管理持久性),我建议您将 EntityManageFactory 发布为服务,而不是 EntityManager。然后您的代码将具有以下布局:

    public void someBusinessMethod() { 
      EntityManager em  = Activator.getEntityManager();
      try {
       ...
      } finally {
       em.close();
      }
    }
    

    在你的激活器中:

    public class Activator
        implements BundleActivator {
      private static ServiceTracker emfTracker;
    
      public void start(BundleContext context) {
        emfTracker = new ServiceTracker(context, EntityManagerFactory.class.getCanonicalName(),null);
        emftracker.open();
      }
    
      public void stop(BundleContext context){
        emfTracker.close();
        emfTracker = null;
      }
    
      public static EntityManager getEntityManager() {
        return ((EntityManagerFactory)emfTracker.getService()).createEntityManager();
      }
    }
    

    希望这有助于给你一个想法。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2018-12-08
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多