Руководство по Hibernate. Руководство по Hibernate
Скачать 186.74 Kb.
|
Руководство по Hibernate. Введение. Что такое JDBC? JDBC (Java Database Connectivity) – это технология, которая обеспечивает доступ Java API к реляционным базам данных. Благодаря этому, наши Java-приложения могут выполнять SQL-запросы и взаимодействовать с базами данных (далее – БД), котрые поддерживают SQL. JDBC является крайне гибкой и позволяет нам писать приложения, которые не зависят от конкретной платформы и могут взаимодействовать с различными СУБД без каких либо изменение в программном коде. Какие плюсы даёт нам JDBC: Простая и понятная обработка SQL-запросов Крайне убдобна для небольших приложений Простой и понятный синтаксис Какие минусы JDBC: Сложно использовать и поддерживать в больших проектах Большое количество кода Сложно реализовывать концепцию MVC. Что такое ORM (Object Relational Mapping)? Когда мы создаём приложение на Java и хотим сделать так, чтобы наше приложение получило доступ к информации, которая хранится в БД, мы должны понимать крайне важную деталь. Сущействует огромная разница между объектной моделью и реляционной. СУБД даёт нам информацию в табличном формате, в то время, как Java даёт нам информацию в виде некоего графа объектов. Представим ,что у нас есть класс Developer, который представляет разработчика: Класс Developer.java package net.proselyte.hibernate.intro; public class Developer { private int id; private String firstName; private String lastName; private String specialty; private String salary; public Developer() { } public Developer(int id, String firstName, String lastName, String specialty, String salary) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.specialty = specialty; this.salary = salary; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getSpecialty() { return specialty; } public void setSpecialty(String specialty) { this.specialty = specialty; } public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } } И есть таблица в БД, которая также представляет разработчика: Таблица HIBERNATE_DEVELOPER: create table HIBERNATE_DEVELOPERS ( id INT NOT NULL auto_increment, first_name VARCHAR(50) default NULL, last_name VARCHAR(50) default NULL, specialty VARCHER(50) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Допустим, что после того, как мы создали и java-класс и таблицу в БД, нам необходимо изменить нашу БД, у нас сразу же возникает проблема. К тому же, когда мы записываем или читаем данные в/из БД, у нас есть 5 проблем, которые связаны с разницей между объекто-ориентированной (далее – ОО) моделью и реляционной моделью: Наследование В реляционной модели нет никакого понятия, похожего на наследование, которое является одним из ключевых принципов ООП. Идентификация Для БД есть только одна сущность, по которому объект может быть идентифицирован – это Первичный Ключ (Primary Key). В то время, как в Java у нас есть такие вещи, как (entity1 == entity2) и (object1.equals(object2)). Ассоциации В Java мы используем ссылки на объекты для ассоциации, а в реляционной модели – Внешний Ключ (Foreign Key). Доступ В Java и в реляционной БД абсолютно разные способы получения доступа в объекту. Инкапсуляция Крайне часто, при разработке приложений ,вы будете сталкиваться (или уже сталкивались) с тем, что наша ОО модель имеет больше классов, чем таблиц в нашей БД. Отсюда возникает проблема: как сделать так, чтобы Java приложение получало доступ к БД и могло корректно интерпретировать эту информацию. Другими словами, нам нужно создать связь между Объектом и реляционной сущностью, иначе говоря Объектно-Реляционное-Связывание или же – ORM (Object-Relational Mapping). ORM – это техника программирования, которая служит для того, чтобы обеспечивать преобразование данных при их обмене между реляционной базой данных и (в нашем случае) Java. Так какие же преимущества нам даёт ORM в сравнение с JDBC? Позволяет нашим бизнес методам обращаться не к БД, а к Java-классам Ускоряет разработку приложения Основан на JDBC Отделяет SQL-запросы от ОО модели Позволяет не думать о реализации БД Сущности основаны на бизнес-задачах, а не на стуктуре БД Управление транзакциями ORM состоит из: API, который реализует базовые операции (СОЗДАНИЕ, ЧТЕНИЕ, ИЗМЕНЕНИЕ, УДАЛЕНИЕ) объектов-моделей. Средства настройки метаданных связывания Технику взаимодействия с транзакциями, которая позволяет реализовать такие функции, как dirty checking, lazy association fetching и т.д. А самыми распрастранёнными ORM фреймворками являются: Hibernate (который мы и будем изучать в этом цикле статей) EJB JDO Spring DAO TopLink Архитектура. Hibernate – это ORM фреймворк для Java с открытым исходным кодом. Эта технология является крайне мощной и имеет высокие показатели производительности. Hibernate создаёт связь между таблицами в базе данных (далее – БД) и Java-классами и наоборот. Это избавляет разработчиков от огромного количества лишней, рутинной работы, в которой крайне легко допустить ошибку и крайне трудно потом её найти.. Схематично это можно изобразить следующим образом: Какие же преимущества даёт нам использование Hibernate? Обеспечивает простой API для записи и получения Java-объектов в/из БД. Минимизирует доступ к БД, используя стратегии fetching. Не требует сервера приложения. Позволяет нам не работать с типами данных языка SQL, а иметь дело с привычыми нам типами данных Java. Заботится о создании связей между Java-классами и таблицами БД с помощью XML-файлов не внося изменения в программный код. Если нам неоходимо изменить БД, то достаточно лишь внести изменения в XML-файлы. Hibernate поддердивает все основные СУБД: MySQL, Oracle, PostgreSQL, Microsoft SQL Server Database, HSQL, DB2. Hibernate также может работать в связке с такими технологиями, как Maven и J2EE. Архитектура Приложение, которе использует Hibernate (в крайне поверхностном представлении) имеет такую архитектуру: Если мы рассмотрим строение самого Hibernate более подробно, что этот же рисунок будет выглядеть следующим образом: Hibernate поддерживает такие API, как JDBC, JNDI, JTA. JDBC обеспечивает простейший уровень абстракции функциональности для реляционных БД. JTA и JNDI, в свою очередь, позволяют Hibernate использовать серверы приложений J2EE. Давайье рассмотрим отдельно каждый из элементов Hibernate, которые указаны в схеме: Transaction Этот объект представляет собой рабочую единицу работы с БД. В Hibernate транзакции обрабатываются менеджером транзакций. SessionFactory Самый важный и самый тяжёлый объект (обычно создаётся в единственном эземпляре, при запуске прилодения). Нам необходима как минимум одна SessionFactory для каждой БД, каждый из которых конфигурируется отдельным конфигурационным файлом. Session Сессия исползуется для получения физического соединения с БД. Обычно, сессия создаётся при необходимости, а после этого закрывается. Это связано с тем, что эти объекты крайне легковесны. Чтобы понять, что это такое, модно сказать, что создание, чтение, изменение и удаление объектов происходит через объект Session. Query Этот объект использует HQL или SQL для чтения/записи данных из/в БД. Экземпляр запроса используется для связыания парметров запроса, ограничения количества результатов, которые будут возвращены и для выполнения запроса. Configuration Этот объект используется для создания объекта SessionFactory и конфигурирует сам Hibernate с помощью конифигурационного XML-файла, который объясняет, как обрабатывать объект Session. Criteria Используется для создания и выполнения объекто-ориентированных запроса дял получения объектов. |