OSGi + Hibernate - PullRequest
       10

OSGi + Hibernate

8 голосов
/ 19 марта 2009

Вместо того, чтобы распределять действия базы данных по четырем (osgi) пакетам, все они выполняют несколько разные вещи. Я хочу создать (простой) пакет OSGi, который отвечает за все проблемы с постоянством. Я чувствую, что это не так просто, как кажется, из-за «уникального загрузчика классов в комплекте». Так что я действительно был бы признателен, если бы кто-то знал решение этой проблемы.

Ответы [ 5 ]

5 голосов
/ 19 марта 2009

Есть два способа решения проблемы с загрузкой классов.

  • Вы привязаны к определенной OSGi-Framework или хотите оставаться максимально совместимым? Или вы можете использовать равноденствие для вашей реализации? В Equinox у вас есть механизм под названием Buddy Classloading. Это дополнение позволяет вам увеличить видимость определенных классов между различными OSGi-Bundles. Если вам интересна эта тема, я хотел бы направить вас к этим двум статьям: Понимание того, как плагины Eclipse работают с OSGi , Eclipse - рассказ о двух виртуальных машинах (и многих загрузчиках классов) .
  • Если вы предпочитаете оставаться независимым от реализации OSGi, то вы можете рассмотреть извлечение ваших классов, которые вы хотите сохранить, в отдельный пакет, от которого зависят как Hibernate-Bundle, так и другие ваши пакеты. Таким образом, все они имеют доступ к определению класса сохраняемых классов.
4 голосов
/ 05 апреля 2009

(если вы используете аннотации Hibernate)

Сохраните все загрузчики классов Entities, когда пакет Hibernate получит информацию о аннотированном классе.

Затем сделайте что-нибудь подобное перед сборкой SessionFactory.

ClassLoad cl = Thread.currentThread().getContextClassLoader();
try {
 Thread.currentThread().setContextClassLoader(yourClassLoader);
 factory = cfg.buildSessionFactory(); 
}finally {
 Thread.currentThread().setContextClassLoader(cl);  // restore the original class loader
}
1 голос
/ 13 апреля 2009

Я собираюсь рекомендовать держаться подальше от загрузки классов друзей, поскольку она специфична для реализации Eclipse в Equinox, и, на мой взгляд, люди заставляют ее работать, но они не понимают, почему, и все заканчивают как друзья всех остальное. Это мешает вам правильно понять, как работает загрузка классов OSGi и шаблоны, которые вам нужно использовать (загрузчики составных классов, загрузка классов контекста, службы OSGi и т. Д.) Для работы с ней.

Если ваш пакет персистентности заранее знает, какие типы ему нужны для сохранения, тогда этот пакет может импортировать все необходимые пакеты (Require-Bundle это зло), которые содержат классы вашего домена.

Управление загрузчиком класса контекста (как в ответе Роджера) может помочь с Hibernate, хотя я бы предложил использовать что-то вроде Spring dm, чтобы скрыть это за службой OSGi.

1 голос
/ 27 марта 2009

Только что нашел интересный метод в классе Bundle / api.

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException

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

0 голосов
/ 31 июля 2015
...