Создание сеанса гибернации в службе OSGi с помощью getServiceReference

---обновление 2---

Похоже, странная ошибка была вызвана другой странной ошибкой, касающейся порядка запуска пакета. Несмотря на то, что я установил порядок запуска на «проект A, ЗАТЕМ проект B», иногда он запускал его наоборот, тем самым вызывая проблему с ServiceReference. Кажется, теперь наконец-то работает без проблем.

Еще раз спасибо, что уделили время!

---обновить---

После повторного тестирования моей программы сегодня утром проблема внезапно исчезла. Я даже не изменил код на тот момент. После этого я продвинулся довольно далеко со своим сервисом, но пока я пытался решить проблему с загрузкой класса сопоставления, проблема внезапно появилась снова. Перезапуск Eclipse ничего не дал, перезагрузка моего ПК снова решила проблему. Кажется, это никак не связано с моим кодом...

Несколько минут назад мой сервис заработал, я сделал несколько тестовых записей в своей базе данных, все в порядке. Сейчас я работаю над усовершенствованием своего сервиса (предоставляя больше возможностей для взаимодействия с базой данных и т. д.), и проблема снова возникает, хотя я ничего не менял в этой части кода. .

TL;DR:

Похоже, это совершенно случайный баг.

В любом случае, спасибо за ваши ответы. Я рассмотрю эти варианты, если мне когда-нибудь понадобится копнуть глубже в этом вопросе, но сейчас я думаю, что я соглашусь с доказательством того, что моя программа работает, потому что эта спорадическая ошибка не кажется моей ошибкой. (В любом случае, это было просто упражнение, практической пользы от программы для меня нет).

---original--- Итак, я работал над простой службой 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 );, потому что sr null. (sr указывается в строке выше, ServiceReference sr = context.getServiceReference( SessionFactory.class.getName() ); )

---конец текста---

В общем, я наткнулся на это пошаговое руководство в ответе: Интеграция Hibernate и OSGi, он не может загрузить файл конфигурации hibernate, и, похоже, до сих пор он работал хорошо для меня (гораздо меньше работы с зависимостями и необходимыми пакетами), но затем Я добрался до линии ServiceReference<?> ref = context.getServiceReference(SessionFactory.class.getName()); и уже знал, что должно произойти; да, ref это null, поэтому он не создаст сеанс.

Найдя несколько других примеров «работающих» служб Hibernate, все они, похоже, создают свои сеансы аналогичным образом, но я не могу найти никого, у кого была бы эта проблема.

Что я делаю неправильно, что может быть причиной этой проблемы? Что-то еще упущено?

примечание: для простоты предположим, что моя программа выглядит точно так же, как в вышеупомянутом ответе. Единственный дополнительный шаг, который я сделал, - это поместить пакет «Проект А» в требуемые Bundes для «B», затем я запускаю пакеты в Eclipse Equinox.

Ошибок нет, но при отладке я могу сказать, что ref это null

(Очевидно, я намерен немного придумать это, но для этого мне нужно заставить его работать в первую очередь...)


person NSchneider    schedule 15.10.2014    source источник


Ответы (2)


Я не знаю прямого ответа на ваш вопрос, но если вы просто хотите, чтобы Hibernate работал с OSGi, вы можете посмотреть здесь: JPA Amdatu.

Amdatu JPA упрощает работу с JPA (OpenJPA, EclipseLink или Hibernate) в OSGi, включая декларативное управление транзакциями.

person Paul Bakker    schedule 16.10.2014

Сначала о вашем конкретном вопросе. Я не уверен, что вы можете напрямую получить SessionFactory.

Что работает, так это создать пакет с единицей сохранения, помеченной специальным заголовком манифеста (см. в учебнике). Если у вас установлены aries jpa и hibernate, вы получите EntityManagerFactory как услугу. Поэтому лучше всего начать с этого и использовать jpa вместо конкретного API гибернации.

Если вам нужен сеанс гибернации, вы можете использовать метод развертывания EntityManager, чтобы получить к нему доступ.

Однако гораздо лучше, чем напрямую использовать EntityManagerFactory, использовать расширения чертежей из aries jpa, которые обеспечивают режим управления контейнером. Таким образом, вы можете работать с EntityManager, как в Java EE, и вам не нужно открывать и закрывать его.

В настоящее время я создаю новый пример, чтобы показать, как работать со спящим режимом в karaf. К сожалению, это займет еще некоторое время.

А пока взгляните на мое руководство по Apache karaf DB.

Он показывает, как работать с источниками данных и как выполнять JPA с openjpa. Пример нужно лишь немного изменить, чтобы он работал со спящим режимом.

Я также получил начало примера гибернации. Вероятно, сейчас он не работает в полной мере. Это может дать вам правильные подсказки, как двигаться дальше. Если у вас есть какие-либо вопросы, вы также можете связаться со мной по почте (адрес указан на моем сайте).

person Christian Schneider    schedule 15.10.2014
comment
Я закончил свой пример для спящего режима. Вы можете найти его здесь: github.com/cschneider/Karaf-Tutorial/ дерево/мастер/список задач-cdi - person Christian Schneider; 16.10.2014