В последнее время тема построения модульных приложений на Java становится все более актуальной, в том числе и разработка Enterprise-приложений. Не секрет, что во многих Enterprise приложениях для взаимодействия с БД используется технология
ORM, в частности —
Hibernate. Вот о том, как использовать
Hibernate в модульной системе мы и поговорим.
Если вы еще не знаете, что такое
OSGi и какие у этой технологии есть преимущества, то рекомендую прочитать
статью.
Прежде всего давайте разберемся с тем, что мы хотим. Будем исходить из следующих требований:
1. Нам нужен отдельный бандл, который инкапсулирует в себе
Hibernate, необходимые для его работы библиотеки и какие-то средства инициализации.
2. Все дополнительные средства (
c3p0, jdbc-драйвера,
oscache,
hibernate.cfg.xml) выносим в отдельные фрагментные бандлы. Это позволит заменять используемые средства при необходимости (например, вместо
oscache использовать
ehcache).
3. Сессия
Hibernate должна быть доступна любому бандлу, которому она требуется, поэтому мы ее выносим в сервис.
4. Каждый бандл, использующий
Hibernate, должен иметь возможность зарегистрировать мэпинги для своих сущностей. Для этого бандлы будут выставлять свои собственные реализации соответствующего сервиса.
5. Должна быть реализована опциональная поддержка мэпинга на основе аннотаций, т.е. должен быть реализован отдельный бандл, который инкапсулирует
hibernate-annotations и
ejb3-persistence, а также позволяет регистрировать аннотированные классы.
6. Все используемые сервисы определить как декларативные, что позволит прозрачно разрешить проблему запуска бандлов в нужном порядке.
С требованиями разобрались, приступим к реализации, описание которой вы можете найти под катом.