Вопрос

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

Это было полезно?

Решение

(Если вы используете аннотации 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
}

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top