«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. Entity
Класс 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
}
В нашем примере выше класс SteeringWheel описывает отношение один к одному с нашим классом Car из ранее.
3.4. Entity Manager
Наконец, класс javax.persistence.EntityManager определяет операции с базой данных и с ней. EntityManager содержит общие операции создания, чтения, обновления и удаления (CRUD), которые сохраняются в базе данных.
4. Реализации JPA
Теперь, когда спецификация JPA определяет, как и что мы должны сохранять, нам нужно выбрать поставщика реализации, который предоставит необходимый код. Без такого провайдера нам пришлось бы реализовывать все соответствующие классы для соответствия JPA, а это много работы!
Существует множество провайдеров на выбор, каждый из которых имеет свои плюсы и минусы. Принимая решение о том, что использовать, мы должны учитывать несколько следующих моментов:
- Project maturity – how long has the provider been around, and how well documented is it?
- Subprojects – does the provider have any useful subprojects for our new application?
- Community support – is there anyone to help us out when we end up with a critical bug?
- Benchmarking – how performant is the implementation?
Хотя мы не будем вдаваться в подробности сравнительного анализа различных поставщиков JPA, JPA Performance Benchmark (JPAB) содержит ценную информацию об этом. .
После этого давайте кратко рассмотрим некоторых ведущих поставщиков JPA.
5. Hibernate
По своей сути Hibernate представляет собой инструмент объектно-реляционного сопоставления, обеспечивающий реализацию JPA. Hibernate — одна из самых зрелых реализаций JPA, проект поддерживает огромное сообщество.
«Он реализует все классы javax.persistence, которые мы рассмотрели ранее в этой статье, а также предоставляет функциональность помимо JPA — инструменты Hibernate, проверку и поиск. Хотя эти специфичные для Hibernate API могут быть полезны, они не нужны в приложениях, которым требуется только базовая функциональность JPA.
Давайте кратко рассмотрим, что предлагает Hibernate с аннотацией @Entity.
При выполнении контракта JPA @org.hibernate.annotations.Entity добавляет дополнительные метаданные, выходящие за рамки спецификации JPA. Это позволяет точно настроить постоянство сущности. Например, давайте рассмотрим несколько аннотаций, предлагаемых Hibernate, которые расширяют функциональность @Entity:
- @Table – allows us to specify the name of the table created for the entity
- @BatchSize – specifies the batch size when retrieving entities from the table
Также стоит отметить несколько дополнительных функций, которые не указаны в JPA, но которые могут оказаться полезными в более крупных приложениях: ~~ ~ Для более глубокого изучения сохраняемости Hibernate и Java ознакомьтесь с нашей серией руководств по сохраняемости Spring.
- Customizable CRUD statements with the @SQLInsert, @SQLUpate and @SQLDelete annotations
- Support for soft deleting
- Immutable entities with the @Immutable annotation
6. EclipseLink
EclipseLink, созданный Eclipse Foundation, предоставляет реализацию JPA с открытым исходным кодом. Кроме того, EclipseLink поддерживает ряд других стандартов сохраняемости, таких как архитектура Java для привязки XML (JAXB).
Проще говоря, вместо того, чтобы сохранять объект в строке базы данных, JAXB сопоставляет его с представлением XML.
Далее, сравнивая ту же реализацию аннотации @Entity, мы видим, что EclipseLink снова предлагает разные расширения. Хотя для @BatchSize нет аннотации, как мы видели ранее, EclipseLink предлагает другие параметры, которых нет в Hibernate.
Например:
Чтобы узнать больше о том, что может предложить EclipseLink, перейдите к нашему руководству по EclipseLink с Spring.
- @ReadOnly – specifies the entity to be persisted is read-only
- @Struct – defines the class to map to a database ‘struct’ type
7. Заключение
В этой статье мы рассмотрели Java Persistence API, или JPA.
Наконец, мы рассмотрели, чем он отличается от Hibernate и EclipseLink.
«