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 обрабатывает это с помощью аннотаций. Есть четыре аннотации отношений, которые нам нужно иметь в виду:
@Один к одному
@Один ко многим
@ManyToOne
@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, а это много
работы!
Существует множество провайдеров на выбор, каждый из которых имеет свои плюсы и минусы. Принимая решение о том, что использовать, мы должны учитывать некоторые из следующих моментов :
- Зрелость проекта —
как долго существует поставщик и насколько хорошо он задокументирован?
- Подпроекты —
есть ли у провайдера полезные подпроекты для нашего нового приложения?
- Поддержка сообщества —
есть ли кто-нибудь, кто поможет нам, когда мы столкнемся с критической ошибкой ?
- Бенчмаркинг —
насколько эффективна реализация?
Хотя мы не будем вдаваться в подробности сравнительного анализа различных поставщиков 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
:
@Table
—позволяет нам указать имя таблицы, созданной для объекта
@BatchSize
—указывает размер пакета при извлечении сущностей из таблицы.
Также стоит отметить несколько дополнительных функций, которые не указаны в JPA, но которые могут оказаться полезными в более крупных приложениях:
- Настраиваемые операторы CRUD с
аннотациями @SQLInsert, @SQLUpate и @SQLDelete
. - Поддержка мягкого удаления
- Неизменяемые сущности с аннотацией
@Immutable
Для более глубокого погружения в сохраняемость Hibernate и Java — перейдите к нашей серии руководств по сохраняемости Spring .
6. ЗатмениеСсылка
EclipseLink , созданный Eclipse Foundation, предоставляет реализацию JPA с открытым исходным кодом . Кроме того, EclipseLink поддерживает ряд других стандартов сохраняемости, таких как Java Architecture for XML Binding (JAXB) .
Проще говоря, вместо того, чтобы сохранять объект в строке базы данных, JAXB сопоставляет его с XML-представлением.
Далее, сравнивая ту же реализацию аннотации @Entity
, мы видим, что EclipseLink снова предлагает разные расширения . Хотя для @ BatchSize
нет аннотации , как мы видели ранее, EclipseLink предлагает другие параметры, которых нет в Hibernate.
Например:
@ReadOnly — указывает, что сохраняемый объект доступен только для чтения.
- @
Struct
— определяет класс для сопоставления с типом структуры базы данных.
Чтобы узнать больше о том, что может предложить EclipseLink, перейдите к нашему руководству по EclipseLink с Spring .
7. Заключение
В этой статье мы рассмотрели Java Persistence API или JPA.
Наконец, мы рассмотрели, чем он отличается от Hibernate и EclipseLink.