Получение EntityManagerFactory в Equinox OSGI Framework с использованием Hibernate Unmanaged JPA

Я разрабатываю два пакета OSGI с Equinox Eclipse и Hibernate/JPA, пытаясь сохранить один объект с помощью неуправляемого JPA.

Первый пакет: «Testhibernate» — это пакет, который экспортирует все пакеты из банок hibernates и имеет активатор «org.hibernate.osgi.HibernateBundleActivator», который регистрирует службу OSGI, а также использует тег Equinox. Eclipse-BuddyPolicy: зарегистрирован.

Второй пакет: «TesthibernateConfigDAO» просто имеет зависимость для первого пакета, а также в файле Manifest.mf есть тег Eclipse-RegisterBuddy: Testhibernate для связи с файлом persistence.xml.

В этой второй ошибке, когда я запускаю оба в контейнере OSGI Equinox, если я использую метод:

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

затем я получаю EntityManagerFactory и сохраняю свою сущность прямо в базе данных, и все ОК.

Но я прочитал на официальном сайте hibernate следующее:

17.4.3. Получение EntityMangerFactory

hibernate-osgi регистрирует службу OSGi, используя имя интерфейса JPA PersistenceProvider, который загружает и создает EntityManagerFactory, специфичный для сред OSGi. ВАЖНО, чтобы ваш EMF был получен через сервис, а не создавался вручную. Служба обрабатывает OSGi ClassLoader, обнаруженные точки расширения, сканирование и т. д. Ручное создание EntityManagerFactory гарантированно НЕ работает во время выполнения!

Пример того, как обнаружить и использовать службу, см. в файле HibernateUtil.java для QuickStart unmanaged-jpa.

Итак, я пытаюсь получить EntityManagerFactory следующим образом:

Bundle thisBundle = FrameworkUtil.getBundle( HibernateUtil.class );
BundleContext context = thisBundle.getBundleContext();

ServiceReference serviceReference = context.getServiceReference( PersistenceProvider.class.getName() );
PersistenceProvider persistenceProvider = (PersistenceProvider) context.getService( serviceReference );
emf = persistenceProvider.createEntityManagerFactory( "PersistenceProcessDataUnit", null );

Я отладил это, и я просто правильно получаю службу и объект persistenceProvider, но когда я выполняю последнюю попытку получить EntityManagerFactory, я получаю сообщение об ошибке:

И я трачу более 3 дней на чтение официальной документации и не понимаю, в чем проблема.

Ваша установка не сработает. Вы можете создать EMF только в том случае, если файл persistence.xml с описанием модуля доступен из кода, в котором вы создаете фабрику менеджера сущностей. В этом случае вы создаете фабрику в пакете, который не содержит файл persistence.xml. NPE, вероятно, является результатом отсутствия нулевой проверки в коде гибернации для BundleWiring.listResources (ошибка, конечно), но это всего лишь результат отсутствия доступа к файлу описания модуля сохранения.


person user2935659    schedule 29.11.2013    source источник


Ответы (2)


Вы должны создать фабрику диспетчера сущностей в комплекте TestHibernate и зарегистрировать EMF как службу. Затем пакет DAO может найти эту службу и выполнить ее действия.

Между прочим: именно так будет работать OSGi-совместимое решение с учетом спецификаций OSGi. Я бы посоветовал посмотреть примеры в загрузке Gemini JPA и прочитать спецификации OSGi, относящиеся к JPA. и JNDI (скачайте с сайта OSGi Alliance). Но, возможно, вы уже сделали это.

После нескольких дней попыток использовать спящий режим в Equinox Osgi я понял. Я создал тему на форуме Hibernate, чтобы вы могли туда зайти:

person Arie van Wijngaarden    schedule 01.12.2013
comment
org.osgi.framework.BundleException: Исключение в testhibernateconfigdao.HibernateJpaActivator.start() пакета TesthibernateConfigDAO. в org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734) в org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) в org.eclipse .osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) в org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) в org.eclipse.osgi.framework .internal.core.Framework.resumeBundle(Framework.java:1176) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) в org.eclipse.osgi.framework.internal.core .StartLevelManager.resumeBundles(StartLevelManager.java:544) в org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) в org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel (StartLevelManager.java:243) на org.eclipse.osgi.framework.internal.core.StartLevelManager.di spatchEvent(StartLevelManager.java:438) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) в org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java: 230) в org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) Вызвано: javax.persistence.PersistenceException: невозможно настроить EntityManagerFactory в org.hibernate.ejb.Ejb3Configuration. configure(Ejb3Configuration.java:387) в org.hibernate.osgi.OsgiPersistenceProvider.createEntityManagerFactory(OsgiPersistenceProvider.java:83) в de.test.HibernateUtil.getEntityManagerFactory(HibernateUtil.java:29) в de.test.HibernateUtil .getEntityManager(HibernateUtil.java:18) в testhibernateconfigdao.HibernateJpaActivator.start(HibernateJpaActivator.java:24) в org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) в java.sec urity.AccessController.doPrivileged(Native Method) в org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) ... еще 12 Вызвано: java.lang.NullPointerException в org .hibernate.osgi.OsgiScanner.getFilesInJar(OsgiScanner.java:112) на org.hibernate.ejb. Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:506) в org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:477) в org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:363) ... еще 19 - person user2935659; 02.12.2013

https://forum.hibernate.org/viewtopic.php?f=1&t=1029974&p=2473673#p2473673

В основном вам нужно делать шаг за шагом, настраивая каждый пакет, который вам нужен, а также обновлять до версии Hibernate 4.3.0 и следить за порядком ваших пакетов во время выполнения!

Прежде всего спасибо за ваш ответ, я попробую таким образом. Но я думал, что это возможно, потому что я включил пункт Eclipse-RegisterBuddy: Testhibernate, чтобы Testhibernate мог видеть файл persistence.xml в папке < i>TesthibernateConfigDAO, и я мог сохранять объекты с помощью первого метода. У меня всего несколько дней в OSGI Equinox!!! Спасибо большое за вашу помощь!!!

person user2935659    schedule 11.12.2013