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?的主要内容,如果未能解决你的问题,请参考以下文章