В предыдущем посте суровый челябинский программист обещал рассказать про особенности использования Hibernate в OSGi-среде. Точнее в среде Equinox. Чтож, приступим.
Прежде всего давайте разберемся с тем, что мы хотим. Будем исходить из следующих требований:
1. Нам нужен отдельный бандл, который инкапсулирует в себе hibernate, необходимые для его работы библиотеки и какие-то средства инициализации.
2. Все дополнительные средства (c3p0, jdbc-драйвера, oscache, hibernate.cfg.xml) выносим в отдельные фрагментные бандлы. Это позволит заменять используемые средства при необходимости (например, вместо oscache использовать ehcache).
3. Хибернейтовская сессия должна быть доступна любому бандлу, импортирующему бандл с hibernate, поэтому мы ее выносим в сервис.
4. Каждый бандл, использующий хибернейт, должен иметь возможность зарегистрировать мэпинги для своих сущностей. Для этого бандлы будут выставлять свои собственные реализации соответствующего сервиса.
5. Должна быть реализована опциональная поддержка мэпинга на основе hibernate-annotations, т.е. должен быть реализован отдельный бандл, который инкапсулирует hibernate-annotations и ejb3-persistence, а также позволяет регистрировать аннотированные классы.
6. Все используемые сервисы определить как декларативные, что позволит прозрачно разрешить проблему запуска бандлов в нужном порядке.
С требованиями разобрались, приступим к реализации. Создать бандл, инкапсулирующий хибернейт довольно просто - достаточно создать в бандле каталог lib и поместить туда следующие библиотеки:
- cglib-nodep.jar
- dom4j.jar
- hibernate3.jar
- jta.jar
Внимание: я описываю ситуацию для Hibernate 3.2.0 GA. Насколько я знаю, в новых версиях Hibernate есть изменения, в частности, касающиеся логера. Впрочем, эти изменения непринципиальны