У меня есть приложение Eclipse на основе плагинов, в котором я помещаю свои постоянные данные в X-плагин и службу hibernate-database в Y-плагин.
Персистентные классы находятся в X, а HibernateUtil, Dao, все связанные с гибернацией банки и файлы сопоставления hbm.xml для постоянных классов находятся в Y.
Когда я запускаю приложение, я вижу множество исключений, таких как:
java.lang.RuntimeException
javassist.CannotCompileException
java.lang.ClassNotFoundException
org.hibernate.HibernateException
Все они заканчиваются на "java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy"
Если я работаю с базой данных на моем локальном хосте, эти исключения не влияют на мое приложение. Но когда я пытаюсь подключиться к удаленной базе данных, мои вложенные запросы HQL не работают. Я предполагаю, что это имеет какое-то отношение к прокси.
Есть ли способ избавиться от этой проблемы без слияния плагинов X и Y в один плагин?
Проблема, скорее всего, не связана с механизмом загрузки плагинов eclipse. Там исправление для этого - приятель загрузки.
В файле MANIFEST.MF плагина Hibernate (который НЕОБХОДИМО загружать приятель), например org.hibernate.eclipse, добавьте строку:
Eclipse-BuddyPolicy:registered
и в файле MANIFEST.MF вашего проекта плагина или проекта RCP добавьте строку:
Eclipse-RegisterBuddy:org.hibernate.eclipse
Это должно решить проблему.
Вот сообщение в блоге об этой проблеме:
http://hwellmann.blogspot.de/2008/11/hibernate-and-osgi-pragmatic-solution.html
У меня было это исключение, которое проводило тест Arquillian. В моем случае я забыл добавить persistence.xml в архив:
archive.addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml");
В корне это классическая проблема OSGi ClassLoader. Решение зависит от версии Hibernate, которую вы используете.
Вы должны установить ProxyFactory classLoaderProvider для предоставления загрузчика классов, который включает
Hibernate теперь использует загрузчик классов класса entity на фабрике прокси. Вы должны включить прокси-сервер Hibernate (org.hibernate.proxy) и Javassist (javassist.util.proxy) в разделе Import-Package манифеста OSGi пакета (ов), который содержит классы сущностей 3, которые могут отличаться от который создает EntityManagerFactory.
Это решает проблему:
В X плагине Eclipse-BuddyPolicy: зарегистрировано
В Y-плагине Require-Bundle: (x plugin id) Eclipse-RegisterBuddy: (x плагин id)
Поддерживаемые библиотеки Hibernate были пропущены в вашем удаленном развертывании.
создайте папку lib
разделе WEB-INF и скопируйте все поддерживающие файлы jar в эту папку lib.