Перейти к основному содержимому

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

· 5 мин. чтения

1. Введение

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

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

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

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

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

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

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

Java Persistence API, или 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. @Один к одному
  2. @Один ко многим
  3. @ManyToOne
  4. @ManyToMany

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

@Entity
public class SteeringWheel {

@OneToOne
private Car car

// getters and setters
}

В нашем примере выше класс SteeringWheel описывает связь один к одному с нашим классом Car из предыдущего.

3.4. Менеджер объекта

Наконец, класс javax.persistence.EntityManager определяет операции с базой данных и с базой данных. 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 , проверку и поиск . Хотя эти специфичные для Hibernate API могут быть полезны, они не нужны в приложениях, которым требуется только базовая функциональность JPA.

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

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

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

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

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

Для более глубокого погружения в сохраняемость Hibernate и Java — перейдите к нашей серии руководств по сохраняемости Spring .

6. ЗатмениеСсылка

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

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

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

Например:

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

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

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

В этой статье мы рассмотрели Java Persistence API или JPA.

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