powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
12 сообщений из 12, страница 1 из 1
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37894621
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу собрать классы Entity с аннотациями из плагинов в кучу, имея сторонний Java plugin Framework. А этот JPF видимо использует разные загрузчики классов для каждого плагина, и Hibernate не может прочитать аннотации из классов. Вот суть примера (без фреймворка):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
URLClassLoader loader;
        //так работает
        //loader = new URLClassLoader(new URL[]{new File("d:/netbeans/plugs/testplug.jar").toURI().toURL()},URLClassLoader.class.getClassLoader());
        //так не работает  
        loader = new URLClassLoader(new URL[]{new File("d:/netbeans/plugs/testplug.jar").toURI().toURL()});
        Class cl = loader.loadClass("test.plugins.impl.TestEntity");

        AnnotationConfiguration ac = new AnnotationConfiguration();
        ac.addAnnotatedClass(cl);
        SessionFactory sf = ac.configure().buildSessionFactory();


Ошибка такая:
Код: plaintext
entity class not found: test.plugins.impl.TestEntity
Наследоваться от загрузчика я не могу, фреймворк не мой и лезть в него не хочется. Можно что-нить придумать?
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897378
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переформулирую вопрос. Возможно ли, используя Hibernate/JPA, организовать поиск аннотированных классов и их маппинг, указав путь к jar файлам, содержащим такие классы?
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897399
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите документнацию к классу Configuration. Через него можно все маппинги заполнить не прибегая к сканированию классов
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897412
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, можно, наверное используя XML. Но это мне не подходит.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897416
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerBlazkowicz, можно, наверное используя XML. Но это мне не подходит.
Не пробовали до конца доку дочитать. Например Configuration.addAnnotatedClass() ?
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897421
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, пробовал. Но это в первом посте темы вообще-то
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897425
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerBlazkowicz, пробовал. Но это в первом посте темы вообще-то
Sorry, меня сбило что там AnnotationConfiguration, который уже deprecated.
Проблема в том что в Java класс идентифицируется не только именем, а ещё и загрузчиком.
Тот класс, который вы загрузили и добавили в Configuration, это не тот же самый класс, который вы потом пытаетесь использовать. Поэтому он его и не находит. Вам нужно делать тоже самое, но вместо того чтобы самому грузить классы, отыскивать их правильным образом в вашей инфруструктуре.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897441
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, вот про отыскивание в инфраструктуре и речь. У меня есть набор jar файлов - плагинов, в каждом из этих файлов есть аннотированные классы. Приложение, которое работает с плагинами, должно просканировать jar-ы (это идеальный вариант), либо запросить у плагинов список классов, и создать на основе этого сессию. Вариант с запрашиванием валится, потому что авторТот класс, который вы загрузили и добавили в Configuration, это не тот же самый класс, который вы потом пытаетесь использовать. Поэтому он его и не находит.
То есть остается два варианта.
1. Расширить системный загрузчик на jar-ы плагинов, чтобы хибернейт и мои классы оказались в одном пространстве - а это для меня означает отказаться от использования фреймворка, который я пытался использовать вначале, и заменить его другим, или самому написать.
2. Может быть все-таки есть механизм, который именно сканирует указанные jar-ы? Невзирая на то плагины это или что-то другое. Согласитесь, вещь полезная, и если в реализациях JPA такого нет, то это стоило бы придумать. Ведь можно даже без всяких плагинов в рамках одного приложения напаковать сущностей в архивы просто для удобства и отделения их от всего остального в приложении.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897447
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker2. Может быть все-таки есть механизм, который именно сканирует указанные jar-ы? Невзирая на то плагины это или что-то другое. Согласитесь, вещь полезная, и если в реализациях JPA такого нет, то это стоило бы придумать. Ведь можно даже без всяких плагинов в рамках одного приложения напаковать сущностей в архивы просто для удобства и отделения их от всего остального в приложении.
Вы, кажется, не до конца поняли почему ваш вариант не работает. Хибер привязываем маппинг непосредственно к классу. Тут никакое сканирование не вылечит, т.е. нужно знать ещё ClassLoader, которым в вашей системе будет загружен конкретный класс. А у каждого плагина он свой.
Нужно рассмотреть вариант перехватата инициализации каждого плагина. В этот момент его классы уже будут доступны в нужнов виде.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897453
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите, в Plugin через PluginDescriptor можно найти путь к классам. Этот путь и можно просканировать. Важно только это правильно делать при старте и остановке плагина. Чтобы добавлять-удалять маппинги на классы.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37897459
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, очередной раз спасибо за помощь. Попробую тест набросать.
...
Рейтинг: 0 / 0
Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
    #37898090
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, вариант, назовем его "расширение Classpath на плагины" работает отлично. Но, хотелось бы разобраться теперь до конца со сканированием.
В Persistence.xml для Hibernate-провайдера JPA есть такое:
Код: xml
1.
<property name="hibernate.archive.autodetection" value="class, hbm"/> 


и есть такое:
Код: xml
1.
<jar-file>orm/entities.jar</jar-file>


Причем Hibernate обеспечивает работу этого механизма в SE, необязательно в EE.
То есть хибернейт способен найти указанный джар, посмотреть какие там есть классы, у каждого из них взять метаданные и создать маппинг. И в интернете много ссылок довольных людей, у которых это работает. У меня, к сожалению, не работает. Простой пример:
Имеем проект, в котором определен persistence.xml, сконфигурированный для использования с Hibernate 4, также используется автосоздание схемы:
Код: xml
1.
<property name="hibernate.hbm2ddl.auto" value="create"/>


В проекте определена одна своя сущность. И есть тестовый джар, в котором лежит еще одна сущность. При запуске основного проекта генерится схема, в которой присутствует родная сущность, но нет сущности из тестового джара. При этом хибернейт совершенно точно находит тестовый джар (если убрать из указанного места - ругается). Определенно, что-то я сделал неправильно. Что именно? Может, к джарам есть специальные требования?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: разные ClassLoader-ы для Entity, как заставить работать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]