【问题标题】:Creating Hibernate Session in OSGi Service with getServiceReference使用 getServiceReference 在 OSGi 服务中创建休眠会话
【发布时间】:2014-12-10 15:49:01
【问题描述】:

---更新2---

似乎这个奇怪的错误是由另一个关于捆绑启动顺序的奇怪错误引起的。即使我将启动顺序设置为“项目 A,然后是项目 B”,它有时也会以相反的方式启动它,从而导致 ServiceReference 出现问题。似乎现在终于可以正常工作了。

再次感谢您抽出宝贵时间!

---更新---

今天早上再次测试我的程序后,问题突然消失了。那时我什至没有修改代码。在那之后,我的服务已经走得很远了,但是当我试图解决加载映射类的问题时,问题突然又出现了。 重启 Eclipse 什么也没做,重启我的电脑又解决了这个问题。 它似乎与我的代码没有任何联系......

几分钟前,我的服务开始工作,我在我的数据库中做了一些测试条目,一切都很好。现在我正在充实我的服务(提供更多与数据库交互的选项等),问题又出现了再次,即使我没有更改这部分代码的任何内容.

TL;DR:

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

无论如何,感谢您到目前为止的回复。如果我需要更深入地研究这个问题,我会考虑这些选项,但现在我认为我正在努力证明我的程序有效,因为这个零星的错误似乎不是我的错。 (反正这只是一个练习,这个程序对我没有实际的实际用途)。

---原创--- 所以我一直在研究一个简单的 OSGi 服务,它使用 Hibernate 来访问数据库。

---可选的文字墙---

关于这个主题的大部分信息似乎都已经过时了,主要是因为官方 OSGi 对休眠的支持还不到一年。在那之前的一切都相当复杂,也不是很有帮助。 (我在放弃之前花了很多时间)。 关于这个主题的开发指南 (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch17.html) 也相当稀少(我是 Hibernate 和 OSGi 的初学者,本指南似乎期望获得相当深入的知识)。我尝试让快速入门项目“非托管本机”工作,但我之前没有使用过 maven 或 karaf,并且在那里遇到了一些问题。

之后我只是尝试将他们的 HibernateUtil (https://github.com/hibernate/hibernate-orm/blob/4.2/documentation/src/main/docbook/quickstart/tutorials/osgi/unmanaged-native/src/main/java/org/hibernate/osgitest/HibernateUtil.java) 集成到我自己的程序中,但我总是会在这一行得到一个 nullPointerException:sf = (SessionFactory) context.getService( sr );,因为srnull。 (sr 在上面的行中指定,ServiceReference sr = context.getServiceReference( SessionFactory.class.getName() );

---正文结束---

所以基本上我在回答中偶然发现了这个分步指南Hibernate and OSGi integration, it unable to load hibernate configuration file,到目前为止它似乎对我来说效果很好(使用依赖项和所需捆绑包的工作要少得多),但是随后我接了电话ServiceReference<?> ref = context.getServiceReference(SessionFactory.class.getName()); 我已经知道会发生什么;是的,refnull,因此它不会创建会话。

在找到一些“工作”Hibernate Services 的其他示例后,他们似乎都以类似的方式创建了他们的 Session,但我找不到其他人有这个问题。

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

注意:为简单起见,假设我的程序看起来与上面提到的答案完全一样。我所做的唯一额外步骤是将“项目 A”包放入“B”所需的捆绑包中,然后我在 Eclipse Equinox 中启动捆绑包。

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

(显然我打算稍微花点心思,但为此我首先需要让它工作......)

【问题讨论】:

    标签: hibernate session osgi sessionfactory


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先关于您的具体问题。我不确定您是否可以直接获取 SessionFactory。

      有效的方法是创建一个带有持久性单元的包,该持久性单元标有一个特殊的 Manifest 标头(参见教程)。如果您随后安装了 aries jpa 和 hibernate,那么您将获得 EntityManagerFactory 作为服务。所以最好的开始是使用它并使用 jpa 而不是特定的休眠 API。

      如果你需要休眠会话,那么你可以使用 EntityManager 的 unwrap 方法来访问它。

      虽然比直接使用 EntityManagerFactory 更好的是使用来自 aries jpa 的蓝图扩展,它提供容器管理模式。因此,您可以像在 Java EE 中一样使用 EntityManager,而不必打开和关闭它。

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

      现在看看我的Apache karaf DB tutorial

      它展示了如何使用 DataSources 以及如何使用 openjpa 进行 JPA。该示例只需要稍作修改即可与 hibernate 一起使用。

      我也开始使用hibernate example。它目前可能还没有完全工作。它可能会为您提供正确的线索,但如何继续。如果您有任何问题,也可以通过邮件与我联系(地址在我的网站上)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2011-07-19
      • 2010-10-14
      • 1970-01-01
      • 2012-06-02
      相关资源
      最近更新 更多