Использование Hibernate с плагинами Dynamic Eclipse - PullRequest
4 голосов
/ 26 июня 2009

У меня есть классы с одинаковыми именами в разных плагинах, которые я использую для своего приложения, и я хотел бы иметь возможность правильно настроить их с помощью Hibernate. Проблема в том, что, похоже, Hibernate динамически генерирует имя пакета класса при попытке найти класс, когда он выполняет его отображение. С одним плагином эта схема работает, но через несколько плагинов она не работает. Похоже, что Hibernate запутывается при работе с файлами конфигурации Hibernate в нескольких плагинах.

Это потому, что каждый плагин имеет свой собственный загрузчик классов? Каков наилучший способ продолжить работу с существующими плагинами и Hibernate?

Ответы [ 2 ]

4 голосов
/ 02 июля 2009

Проблема в том, что каждый плагин имеет свой собственный Classloader, а Hibernate использует Reflection для поиска нужных классов.

У меня есть очень хорошая статья об этой проблеме, но эта на немецком языке. Я постараюсь объяснить, что вам нужно делать.

Чтобы разделить структуру данных на несколько плагинов, вы должны поместить ее в плагин и включить функцию под названием buddy-policy . Допустим, у вас есть плагин main-application, который запускает hibernate при запуске, этот плагин должен «видеть» классы из datastructure-plugin. Для этого основной плагин устанавливает свою Buddy-Policy на "зарегистрированный", а плагин datastructure-plugin регистрируется как "приятель" . К сожалению, вы должны сделать все это прямо в файле манифеста, по крайней мере, в 3.3 не было никакого способа сделать это в редакторе.

Как только эта политика собеседника сработает, Hibernate также будет работать.

Я посмотрел свое старое приложение, и вот как я это сделал.

  1. Основное приложение (toolseye.rcp) зависит от плагина гибернации (de.eye4eye.hibernate) и плагина структуры данных (toolseye.datastructures)
  2. Плагин hibernate определяет свою политику собеседников как "зарегистрированную"
  3. Плагин структуры данных регистрируется в плагине hibernate

Вот важные строки:

Hibernate-плагин de.eye4eye.hibernate

Eclipse-BuddyPolicy: registered

Datastructure-plugin toolseye.datastructures

Eclipse-RegisterBuddy: de.eye4eye.hibernate

Поместите эти строки прямо в MANIFEST.MF

Оба плагина должны переэкспортировать свои пакеты, чтобы их могло использовать основное приложение или любой другой слой между ними. Надеюсь, что это помогло.

1 голос
/ 12 августа 2009

Просто чтобы завершить это.

Вместо использования Hibernate EclipseLink может использоваться в качестве JPA-провайдера в приложении Eclipse RCP. EclipseLink - это бывший TopLink от Oracle, который был выбран в качестве эталонной реализации для JPA 2.

Смысл для RCP в том, что EclipseLink доступен как OSGI-Bundles (org.eclipse.persistence.jpa), и благодаря этому он может загружать классы из другого плагина без дополнительной политики собеседников.

В настоящее время я играю вокруг, используя следующую структуру проекта (Pattern-View-Presenter Pattern). Имена в скобках указывают плагины зависимости (не все включены, только те, которые связаны с этим вопросом)

  • rcp.mvp.view (rcp.mvp.presenter / rcp.mvp.model)
  • rcp.mvp.presenter (rcp.mvp.data - данные реэкспортируют модель, так что это здесь не нужен) *
  • rcp.mvp.data (rcp.mvp.data.mysql / rcp.mvp.model / javax.persistence / org.eclipse.persistence.jpa)
  • rcp.mvp.data.mysql - предоставляет только mysql-jdbc-драйвер. должен быть внутри пути к классам
  • rcp.mvp.model

В этом сценарии поставщик JPA в плагине данных может загружать классы из плагина модели без политики друзей.

* Обратите внимание, что докладчик не зависит от каких-либо пакетов JPA, так как он инкапсулирован DAO (основная причина, почему их по-прежнему использовать)

Ссылки

...