«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 обрабатывает это с помощью аннотаций. Есть четыре аннотации отношений, которые мы должны иметь в виду:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @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, а это много работы!

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

  1. Project maturity – how long has the provider been around, and how well documented is it?
  2. Subprojects – does the provider have any useful subprojects for our new application?
  3. Community support – is there anyone to help us out when we end up with a critical bug?
  4. 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:

  1. @Table allows us to specify the name of the table created for the entity
  2. @BatchSizespecifies the batch size when retrieving entities from the table

Также стоит отметить несколько дополнительных функций, которые не указаны в JPA, но которые могут оказаться полезными в более крупных приложениях: ~~ ~ Для более глубокого изучения сохраняемости Hibernate и Java ознакомьтесь с нашей серией руководств по сохраняемости Spring.

  1. Customizable CRUD statements with the @SQLInsert, @SQLUpate and @SQLDelete annotations
  2. Support for soft deleting
  3. 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.

  1. @ReadOnly – specifies the entity to be persisted is read-only
  2. @Struct – defines the class to map to a database ‘struct’ type

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

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

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

«