Рубрики
Без рубрики

Разница между JPA, Hibernate и EclipseLink

Быстрое сравнение между JPA, Hibernate и EclipseLink.

Автор оригинала: Sam Millington.

1. введение

В этом уроке мы обсудим Hibernate и Java Persistence API (JPA) – с акцентом на различиях между ними.

Мы начнем с изучения того, что такое JPA, как он используется и основные концепции, лежащие в его основе.

Затем мы посмотрим, как Hibernate и EclipseLink вписываются в общую картину.

2. Объектно-реляционное отображение

Прежде чем мы погрузимся в JPA, важно понять концепцию объектно-реляционного отображения, также известную как ORM.

Объектно-реляционное сопоставление-это просто процесс сохранения любого объекта Java непосредственно в таблице базы данных . Обычно имя сохраняемого объекта становится именем таблицы, и каждое поле в этом объекте становится столбцом. При настройке таблицы каждая строка соответствует записи в приложении.

3. Введение в JPA

API сохранения Java, или JPA, – это спецификация, которая определяет управление реляционными данными в приложении Java. API отображает набор концепций, определяющих, какие объекты в приложении должны сохраняться и как они должны сохраняться.

Здесь важно отметить, что JPA – это всего лишь спецификация, и для ее работы требуется реализация – но об этом позже .

Теперь давайте обсудим некоторые основные концепции JPA, которые должна охватывать реализация.

3.1. Субъект

javax.persistence.Класс Entity определяет, какие объекты должны сохраняться в базе данных . Для каждой сохраняемой сущности JPA создает новую таблицу в выбранной базе данных.

Кроме того, все выбранные объекты должны определять первичный ключ, обозначаемый аннотацией @Id . Вместе с аннотацией @GeneratedValue мы определяем, что первичный ключ должен автоматически генерироваться при сохранении записи в базе данных.

Давайте рассмотрим краткий пример сущности, описанной JPA.

@Entity
public class Car {
  
    @GeneratedValue
    @Id
    public long id;

    // getters and setters

}

Помните, что в настоящее время это не повлияет на приложение – JPA не предоставляет никакого кода реализации.

3.2. Стойкость на местах

Другой ключевой концепцией JPA является сохранение поля . Когда объект в Java определяется как сущность, все поля в нем автоматически сохраняются как разные столбцы в таблице сущностей.

Если в сохраняемом объекте есть поле, которое мы не хотим сохранять в базе данных, мы можем объявить это поле переходным с помощью аннотации @Transient .

3.3. Взаимоотношения

Далее, JPA указывает, как мы должны управлять отношениями между различными таблицами базы данных в нашем приложении. Как мы уже видели, JPA обрабатывает это с помощью аннотаций. Есть четыре аннотации отношений, которые мы должны иметь в виду:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Давайте посмотрим, как это работает:

@Entity
public class SteeringWheel {

    @OneToOne
    private Car car

    // getters and setters
}

В приведенном выше примере класс Рулевое колесо описывает отношения один к одному с нашим классом Автомобиль из предыдущих.

3.4. Менеджер предприятия

Наконец, javax.persistence.EntityManager class определяет операции в базе данных и из нее. EntityManager содержит общие операции создания, чтения, обновления и удаления (CRUD), которые сохраняются в базе данных.

4. Реализация JPA

Со спецификацией JPA, определяющей, как и что мы должны сохранять, нам теперь нужно выбрать поставщика реализации для предоставления необходимого кода . Без такого поставщика нам нужно было бы реализовать все соответствующие классы, чтобы соответствовать JPA, и это много работы!

Есть много поставщиков на выбор, и каждый из них демонстрирует свои плюсы и минусы. При принятии решения о том, что использовать, мы должны рассмотреть несколько следующих моментов :

  1. Зрелость проекта – как долго существует поставщик и насколько хорошо он документирован?
  2. Подпроекты – есть ли у поставщика какие-либо полезные подпроекты для нашего нового приложения?
  3. Поддержка сообщества – есть ли кто-нибудь, кто поможет нам, когда мы столкнемся с критической ошибкой ?
  4. Бенчмаркинг – насколько эффективна реализация?

Хотя мы не будем углубляться в сравнительный анализ различных поставщиков JPA, JPA Performance Benchmark (JPAB) содержит ценную информацию об этом.

Теперь, когда с этим покончено, давайте кратко рассмотрим некоторых из ведущих поставщиков JPA.

5. Спящий режим

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

Он реализует все классы javax.persistence , которые мы рассматривали ранее в этой статье , а также предоставляет функции, выходящие за рамки JPA – Hibernate tools , validation и search . Хотя эти API-интерфейсы для гибернации могут быть полезны, они не нужны в приложениях, которым требуется только базовая функциональность JPA.

Давайте быстро взглянем на то, что предлагает Hibernate с аннотацией @Entity .

При выполнении контракта JPA, @org.hibernate.аннотации.Entity добавляет дополнительные метаданные, выходящие за рамки спецификации JPA. Это позволяет точно настроить сохраняемость сущностей. Например, давайте рассмотрим несколько аннотаций, предлагаемых Hibernate, которые расширяют функциональность @Entity :

  1. @Tableпозволяет нам указать имя таблицы , созданной для сущности
  2. @BatchSizeуказывает размер пакета при извлечении объекта s из таблицы

Также стоит отметить несколько дополнительных функций, которые не указаны в JPA, которые могут оказаться полезными в более крупных приложениях:

  1. Настраиваемые операторы CRUD с аннотациями @SQLInsert, @Sqlupdate и @SQLDelete
  2. Поддержка мягкого удаления
  3. Неизменяемые сущности с аннотацией @Immutable

Для более глубокого погружения в гибернацию и персистентность Java – перейдите к нашей серии учебников по персистентности Spring .

6. EclipseLink

EclipseLink , построенный Eclipse Foundation, обеспечивает реализацию JPA с открытым исходным кодом . Кроме того, EclipseLink поддерживает ряд других стандартов персистентности, таких как архитектура Java для привязки XML (JAXB) .

Проще говоря, вместо того, чтобы сохранять объект в строке базы данных, JAXB сопоставляет его с представлением XML.

Далее, сравнивая одну и ту же реализацию @Entity аннотации, мы видим, что EclipseLink снова предлагает различные расширения . Хотя, как мы видели ранее, для @ Batch Size нет аннотации, EclipseLink предлагает другие опции, которых нет в Hibernate.

Например:

  1. @ReadOnly – указывает, что сохраняемая сущность доступна только для чтения
  2. @ Struct – определяет класс для сопоставления с типом структуры базы данных

Чтобы узнать больше о том, что может предложить EclipseLink, ознакомьтесь с нашим руководством по EclipseLink с Spring .

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

В этой статье мы рассмотрели API сохранения Java, или JPA.

Наконец, мы исследовали , чем он отличается от Hibernate и EclipseLink.