Eclipselink:如何在每个捆绑包中获取 EntityManager?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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,*** 不允许我发布完整的 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();
  

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

【讨论】:

以上是关于Eclipselink:如何在每个捆绑包中获取 EntityManager?的主要内容,如果未能解决你的问题,请参考以下文章

如何列出捆绑包中的所有 KEYS?

没有从捆绑包中获取哈希图 - Android

在运行时替换捆绑包中的图像

如何将可运行文件放入捆绑包中?

Symfony - 如何覆盖不在捆绑包中的供应商组件

使用不同实体管理器的不同捆绑包中的实体中的问题