Руководство по 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 проблем, которые связаны с разницей между объекто-ориентированной (далее – ОО) моделью и реляционной моделью:

  1. Наследование
    В реляционной модели нет никакого понятия, похожего на наследование, которое является одним из ключевых принципов ООП.
  2. Идентификация
    Для БД есть только одна сущность, по которому объект может быть идентифицирован – это Первичный Ключ (Primary Key). В то время, как в Java у нас есть такие вещи, как (entity1 == entity2) и (object1.equals(object2)).
  3. Ассоциации
    В Java мы используем ссылки на объекты для ассоциации, а в реляционной модели – Внешний Ключ (Foreign Key).
  4. Доступ
    В Java и в реляционной БД абсолютно разные способы получения доступа в объекту.
  5. Инкапсуляция
    Крайне часто, при разработке приложений ,вы будете сталкиваться (или уже сталкивались) с тем, что наша ОО модель имеет больше классов, чем таблиц в нашей БД.

Отсюда возникает проблема: как сделать так, чтобы 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