Как заставить Spring JPA, Hibernate и OSGi играть в Ниццу? - PullRequest
8 голосов
/ 17 марта 2011

Я пытаюсь запустить WAR-файл внутри контейнера Karaf OSGi.Приложение работает правильно в автономном Jetty 6.1.26, но когда приложение запускается внутри Karaf, я получаю следующее исключение и экземпляр Karaf зависает:

WARN  org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find 
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null

Обратите внимание, что приложение не полагаетсяна Hibernate в отдельном пакете OSGi;в него включены jiber-файлы hibernate в WEB-INF / lib.

Я изучил информацию на этом посте: Equinox (OSGi) и JPA / Hibernate - Поиск сущностей .Однако приложение использует JPA, а не Hibernate напрямую.Конфигурация приложения очень похожа на второй вариант, описанный в этом посте: Разница между настройкой источника данных в файле persistence.xml и в файлах конфигурации Spring .Поэтому у меня нет дескриптора Hibernate SessionFactory, который бы позволял мне устанавливать свойство annotatedClasses.

Есть идеи о том, как обойти исключение?

1 Ответ

4 голосов
/ 18 марта 2011

Я работал параллельно с автором, и я опубликую наше решение здесь для всех, кто столкнется с этим в будущем.

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

Мы использовали persistence.xml файл и orm.xml файл (мы использовали имена по умолчанию, поэтому нам не нужно было указывать и в нашем applicationContext.xml).

Наш файл persistence.xml просто указал на orm.xml с помощью тега <mapping-file>. Он также включал тег <exclude-unlisted-classes/>, чтобы не допустить попытки загрузки дополнительных классов в спящем режиме.

Наш orm.xml файл использовал <entity class="path.to.my.class" metadata-complete="false"/> для вызова каждого класса сущностей, который нам нужно было загрузить. Часть metadata-complete указывает hibernate использовать аннотации, найденные в классе, для завершения настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...