使用getServiceReference在OSGi服务中创建Hibernate会话

使用getServiceReference在OSGi服务中创建Hibernate会话,hibernate,session,osgi,sessionfactory,Hibernate,Session,Osgi,Sessionfactory,---更新2--- 看起来这个奇怪的bug是由另一个关于bundle启动顺序的奇怪bug引起的。即使我将启动顺序设置为“projecta,然后是projectb”,它有时也会以相反的方式启动,从而导致ServiceReference出现问题。看来现在终于可以顺利工作了 再次感谢您抽出时间 ---更新--- 今天早上再次测试我的程序后,问题突然消失了。当时我甚至没有修改代码。在那之后,我的服务取得了很大进展,但当我试图解决加载映射类的问题时,问题突然又出现了。 重新启动Eclipse没有任何作用,

---更新2---

看起来这个奇怪的bug是由另一个关于bundle启动顺序的奇怪bug引起的。即使我将启动顺序设置为“projecta,然后是projectb”,它有时也会以相反的方式启动,从而导致ServiceReference出现问题。看来现在终于可以顺利工作了

再次感谢您抽出时间

---更新---

今天早上再次测试我的程序后,问题突然消失了。当时我甚至没有修改代码。在那之后,我的服务取得了很大进展,但当我试图解决加载映射类的问题时,问题突然又出现了。 重新启动Eclipse没有任何作用,重新启动我的电脑再次解决了问题。它似乎和我的代码没有任何联系

几分钟前,我让我的服务开始工作,我在数据库中做了一些测试条目,一切正常。现在我正在充实我的服务(提供更多与数据库交互的选项等),问题又出现了,尽管我没有对代码的这一部分做任何更改

TL;医生:

似乎是一个完全随机的错误

无论如何,感谢您迄今为止的回复。如果我需要深入研究这个问题,我会考虑这些选项,但现在我想我已经证明了我的程序是可行的,因为这种零星的bug似乎不是我的错。(无论如何,这只是一个练习,这个程序对我来说没有实际用途)

——原创-- 所以我一直在开发一个简单的OSGi服务,它使用Hibernate访问数据库

---可选的文本墙---

关于这个主题的大部分信息似乎已经过时了,主要是因为官方对hibernate的OSGi支持还不到一年。之前的一切都相当复杂,也不是很有帮助。(在放弃之前,我在这方面花了不少时间)。 关于这个主题的devguide()也是相当少的(我是Hibernate和OSGi的初学者,本指南似乎需要相当深入的知识)。我尝试让quickstart项目“非托管本机”工作,但我以前没有使用maven或karaf,因此遇到了一些问题

在那之后,我只是尝试将他们的HibernateUtil()集成到我自己的程序中,但我总是在这一行得到一个nullPointerException:
sf=(SessionFactory)context.getService(sr)sr
null
。(sr在上面的行中指定,
ServiceReference sr=context.getServiceReference(SessionFactory.class.getName());

---文末---

因此,基本上我在回答中偶然发现了这个分步指南:到目前为止,它似乎对我很有效(对于依赖项和所需的bundle的工作要少得多),但随后我进入了行
ServiceReference ref=context.getServiceReference(SessionFactory.class.getName())
我已经知道会发生什么;是的,
ref
null
,因此它不会创建会话

在找到其他几个“工作”Hibernate服务的示例后,所有这些服务似乎都以类似的方式创建会话,但我找不到其他任何人有这个问题

我做错了什么,是什么导致了这个问题?还有什么遗漏吗

注意:为了简单起见,假设我的程序与上面提到的答案完全相同。我所做的唯一的额外步骤是将“ProjectA”包放入“B”所需的Bundes中,然后在EclipseEquinox中启动包

没有错误,但在调试中我可以看出
ref
null


(显然,我想想象一下,但为此,我首先需要让它发挥作用……

首先谈谈你的具体问题。我不确定你能否直接得到SessionFactory

其工作原理是创建一个带有持久性单元的包,持久性单元用一个特殊的清单头标记(请参见教程中的)。如果您随后安装了aries jpa和hibernate,那么您将获得EntityManagerFactory作为服务。所以最好的开始就是使用这个,使用jpa而不是特定的HibernateAPI

如果需要hibernate会话,则可以使用EntityManager的展开方法来访问它

不过,与直接使用EntityManagerFactory相比,更好的方法是使用aries jpa提供的blueprint扩展,它提供了容器管理模式。因此,您可以像在JavaEE中一样使用EntityManager,而不必打开和关闭它

我目前正在创建一个新的示例来演示如何在karaf中使用hibernate。不幸的是,这需要更多的时间

现在来看看我的

它展示了如何使用数据源以及如何使用openjpa进行JPA。使用hibernate只需稍微修改示例


我还得到了一个新的开始。目前它可能还没有完全发挥作用。它可能会给你正确的线索,如何继续下去。如果您有任何问题,也可以通过邮件与我联系(地址在我的网站上)。

我不知道您的问题的直接答案,但是如果您只是想让Hibernate与OSGi一起工作,您可能想看看这里:


Amdatu JPA使在OSGi中使用JPA(OpenJPA、EclipseLink或Hibernate)变得容易,包括声明式事务管理。

我现在完成了Hibernate的示例。你可以在这里找到它: