Автор оригинала: 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 обрабатывает это с помощью аннотаций. Есть четыре аннотации отношений, которые мы должны иметь в виду:
- @OneToOne
- @OneToMany
- @ManyToOne
- @ManyToMany
Давайте посмотрим, как это работает:
@Entity public class SteeringWheel { @OneToOne private Car car // getters and setters }
В приведенном выше примере класс Рулевое колесо описывает отношения один к одному с нашим классом Автомобиль из предыдущих.
3.4. Менеджер предприятия
Наконец, javax.persistence.EntityManager class определяет операции в базе данных и из нее. EntityManager содержит общие операции создания, чтения, обновления и удаления (CRUD), которые сохраняются в базе данных.
4. Реализация JPA
Со спецификацией JPA, определяющей, как и что мы должны сохранять, нам теперь нужно выбрать поставщика реализации для предоставления необходимого кода . Без такого поставщика нам нужно было бы реализовать все соответствующие классы, чтобы соответствовать JPA, и это много работы!
Есть много поставщиков на выбор, и каждый из них демонстрирует свои плюсы и минусы. При принятии решения о том, что использовать, мы должны рассмотреть несколько следующих моментов :
- Зрелость проекта – как долго существует поставщик и насколько хорошо он документирован?
- Подпроекты – есть ли у поставщика какие-либо полезные подпроекты для нашего нового приложения?
- Поддержка сообщества – есть ли кто-нибудь, кто поможет нам, когда мы столкнемся с критической ошибкой ?
- Бенчмаркинг – насколько эффективна реализация?
Хотя мы не будем углубляться в сравнительный анализ различных поставщиков 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 :
- @Table – позволяет нам указать имя таблицы , созданной для сущности
- @BatchSize – указывает размер пакета при извлечении объекта s из таблицы
Также стоит отметить несколько дополнительных функций, которые не указаны в JPA, которые могут оказаться полезными в более крупных приложениях:
- Настраиваемые операторы CRUD с аннотациями @SQLInsert, @Sqlupdate и @SQLDelete
- Поддержка мягкого удаления
- Неизменяемые сущности с аннотацией @Immutable
Для более глубокого погружения в гибернацию и персистентность Java – перейдите к нашей серии учебников по персистентности Spring .
6. EclipseLink
EclipseLink , построенный Eclipse Foundation, обеспечивает реализацию JPA с открытым исходным кодом . Кроме того, EclipseLink поддерживает ряд других стандартов персистентности, таких как архитектура Java для привязки XML (JAXB) .
Проще говоря, вместо того, чтобы сохранять объект в строке базы данных, JAXB сопоставляет его с представлением XML.
Далее, сравнивая одну и ту же реализацию @Entity аннотации, мы видим, что EclipseLink снова предлагает различные расширения . Хотя, как мы видели ранее, для @ Batch Size нет аннотации, EclipseLink предлагает другие опции, которых нет в Hibernate.
Например:
- @ReadOnly – указывает, что сохраняемая сущность доступна только для чтения
- @ Struct – определяет класс для сопоставления с типом структуры базы данных
Чтобы узнать больше о том, что может предложить EclipseLink, ознакомьтесь с нашим руководством по EclipseLink с Spring .
7. Заключение
В этой статье мы рассмотрели API сохранения Java, или JPA.
Наконец, мы исследовали , чем он отличается от Hibernate и EclipseLink.