2014-10-15 2 views
1

--- обновление 2 ---Создание Hibernate сессии в OSGi службы с getServiceReference

Кажется, странная ошибка была вызвана другой странной ошибкой относительно расслоения начать заказ. Несмотря на то, что я установил начальный ордер для «проекта A, THEN project B», он иногда запускал его наоборот, тем самым вызывая проблему с ServiceReference. Кажется, наконец, работать без проблем.

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

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

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

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

TL; DR:

Кажется, совершенно случайно ошибка.

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

--- original --- Итак, я работал над простой службой OSGi, которая использует Hibernate для доступа к базе данных.

--- опциональный стена текста ---

Большая часть информации по этой теме, кажется, довольно устаревшим, в основном потому, что официальная OSGi-поддержка спящего режима едва исполнился год. Все до этого довольно сложно и не очень полезно. (Я трачу на это некоторое время, прежде чем сдаваться). Devguide на эту тему (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch17.html) также довольно редкий (я новичок как для Hibernate, так и OSGi, и это руководство, похоже, ожидает довольно глубоких знаний). Я попытался запустить проект quickstart «неуправляемый родной», но раньше я не использовал 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.(Стер получает указанный в строке выше 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()); , и я уже знал, что произойдет; yup, ref - null, поэтому он не будет создавать сеанс.

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

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

примечание: для простоты предположим, что моя программа выглядит точно так же, как в вышеупомянутом ответе. Единственный дополнительный шаг, который я сделал, это поместить пакет «Project A» в необходимые Bundes для «B», затем я начинаю расслоения в равноденствии eclipse.

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

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

ответ

0

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

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

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

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

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

Сейчас посмотрите на мой Apache karaf DB tutorial

Он показывает, как работать с DataSources и как сделать JPA с OpenJPA. Этот пример нужно немного изменить для работы с спящим режимом.

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

+0

Теперь я закончил свой пример для спящего режима. Вы можете найти его здесь: https://github.com/cschneider/Karaf-Tutorial/tree/master/tasklist-cdi –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^