Я разрабатываю два пакета 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 (ошибка, конечно), но это всего лишь результат отсутствия доступа к файлу описания модуля сохранения.