API за стартиране на Hibernate 5

1. Общ преглед

В този урок ще изследваме новия механизъм, чрез който можем да инициализираме и стартираме Hibernate SessionFactory. Ние ще се съсредоточим особено върху новия процес на първоначално зареждане, тъй като той е преработен във версия 5.0.

Преди версия 5.0, приложенията трябваше да използват класа Configuration, за да стартират SessionFactory. Този подход вече е остарял, тъй като документацията за хибернация препоръчва използването на новия API, базиран на ServiceRegistry.

Най-просто казано, изграждането на SessionFactory е свързано с това, че има реализация на ServiceRegistry, която съдържа услугите, необходими на Hibernate както по време на стартиране, така и по време на изпълнение.

2. Зависимости на Maven

Преди да започнем да изследваме новия процес на зареждане, трябва да добавим файла на jar с хибернация в основния път на проекта. В проект, базиран на Maven, просто трябва да декларираме тази зависимост във файла pom.xml :

 org.hibernate hibernate-core 5.4.0.Final 

Тъй като Hibernate е доставчик на JPA, това също ще включва зависимостта на JPA API транзитивно.

Също така се нуждаем от JDBC драйвер на базата данни, с която работим. В този пример ще използваме вградена база данни H2:

 com.h2database h2 1.4.197 

Чувствайте се свободни да проверите най-новите версии на hibernate-core и H2 драйвер на Maven Central .

3. API за стартиране на зареждане

Bootstrapping се отнася до процеса на изграждане и инициализиране на SessionFactory.

За да постигнем тази цел, трябва да имаме ServiceRegistry, който съхранява Услугите, необходими на Hibernate. От този регистър можем да изградим обект на метаданни, който представлява модела на домейна на приложението и неговото съпоставяне с базата данни .

Нека разгледаме тези основни обекти по-подробно.

3.1. Обслужване

Преди да се копае в ServiceRegistry концепция, първо трябва да се разбере каква услуга е . В Hibernate 5.0 услугата е вид функционалност, представена от интерфейса със същото име:

org.hibernate.service.Service

По подразбиране Hibernate предоставя реализации за най-често срещаните Услуги и те са достатъчни в повечето случаи. В противен случай можем да изградим свои собствени Услуги, за да модифицираме оригиналните функционални функции на хибернация или да добавим нови.

В следващия подраздел ще покажем как Hibernate прави тези услуги достъпни чрез лек контейнер, наречен ServiceRegistry.

3.2. ServiceRegistry

Първата стъпка в изграждането на SessionFactory е създаването на ServiceRegistry. Това позволява да се поддържат различни Услуги, които предоставят функционалности, необходими на Hibernate, и се основава на функционалността Java SPI.

Технически погледнато, можем да разглеждаме ServiceRegistry като лек инструмент за инжектиране на зависимост, където зърната са само от тип Service.

Има два вида ServiceRegistry и те са йерархични . Първият е BootstrapServiceRegistry , който няма родител и притежава следните три необходими услуги :

  • ClassLoaderService: позволява на Hibernate да взаимодейства с ClassLoader на различните среди на изпълнение
  • IntegratorService: контролира откриването и управлението на услугата Integrator , позволявайки на приложения на трети страни да се интегрират с Hibernate
  • StrategySelector: решава изпълнението на различни стратегически договори

За да изградим реализация на BootstrapServiceRegistry , използваме фабричния клас BootstrapServiceRegistryBuilder , който позволява персонализиране на тези три услуги по безопасен за типа начин:

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder() .applyClassLoader() .applyIntegrator() .applyStrategySelector() .build();

Вторият ServiceRegistry е StandardServiceRegistry , който се основава на предишния BootstrapServiceRegistry и съдържа трите услуги, споменати по-горе . Освен това той съдържа различни други услуги, необходими на Hibernate, изброени в класа StandardServiceInitiators .

Подобно на предишния регистър, ние използваме StandardServiceRegistryBuilder, за да създадем екземпляр на StandardServiceRegistry:

StandardServiceRegistryBuilder standardServiceRegistry = new StandardServiceRegistryBuilder();

Под капака StandardServiceRegistryBuilder създава и използва екземпляр на BootstrapServiceRegistry. Можем да използваме и претоварен конструктор, за да предадем вече създаден екземпляр:

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder().build(); StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder(bootstrapServiceRegistry);

Използваме този конструктор, за да заредим конфигурация от ресурсен файл, като например hibernate.cfg.xml по подразбиране , и накрая извикваме метода build () , за да получим екземпляр на StandardServiceRegistry.

StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder .configure() .build();

3.3. Метаданни

След като конфигурирахме всички Услуги, необходими чрез създаването на ServiceRegistry от тип BootstrapServiceRegistry или StandardServiceRegistry, сега трябва да предоставим представянето на модела на домейна на приложението и неговото картографиране на база данни.

Класът MetadataSources е отговорен за това:

MetadataSources metadataSources = new MetadataSources(standardServiceRegistry); metadataSources.addAnnotatedClass(); metadataSources.addResource()

След това получаваме екземпляр от метаданни , който ще използваме в последната стъпка:

Metadata metadata = metadataSources.buildMetadata();

3.4. Сесия фабрика

Последната стъпка е да създадете SessionFactory от предварително създадените метаданни:

SessionFactory sessionFactory = metadata.buildSessionFactory();

Вече можем да отворим сесия и да започнем да продължаваме да четем елементи:

Session session = sessionFactory.openSession(); Movie movie = new Movie(100L); session.persist(movie); session.createQuery("FROM Movie").list();

4. Заключение

В тази статия разгледахме стъпките, необходими за изграждането на SessionFactory. Въпреки че процесът изглежда сложен, можем да го обобщим в три основни стъпки: първо създадохме екземпляр на StandardServiceRegistry , след това изградихме обект на метаданни и накрая изградихме SessionFactory.

Пълният код за тези примери може да бъде намерен в Github.