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

1. Вступление

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

За этим стоитstart by exploring what JPA is, how it’s used, and the core concepts.

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

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

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

Объектно-реляционное отображение - это простоthe process of persisting any Java object directly to a database table. Обычно имя сохраняемого объекта становится именем таблицы, а каждое поле в этом объекте становится столбцом. После настройки таблицы каждая строка соответствует записи в приложении.

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

Java Persistence API, или JPA, является спецификацией, которая определяет управление реляционными данными в приложении Java. API отображает набор концепций, которые определяют, какие объекты в приложении должны сохраняться и как они должны сохраняться.

Здесь важно отметить, чтоJPA is only a specification and that it needs an implementation to work - но большеon that later.

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

3.1. сущность

javax.persistence.Entity class defines which objects should be persisted to the database. Для каждого сохраняемого объекта JPA создает новую таблицу в выбранной базе данных.

Кроме того, все выбранные объекты должны определять первичный ключ, обозначенный саннотацией@Id . Вместе с саннотацией@GeneratedValue мы определяем, что первичный ключ должен автоматически генерироваться, когда запись сохраняется в базе данных.

Давайте быстро рассмотрим сущность, описанную JPA.

@Entity
public class Car {

    @GeneratedValue
    @Id
    public long id;

    // getters and setters

}

Помните, что в настоящее время это не повлияет на приложение - JPA не предоставляет никакого кода реализации.

3.2. Постоянство поля

Another core concept of JPA is field persistence. Когда объект в Java определяется как объект, все поля в нем автоматически сохраняются как разные столбцы в таблице объектов.

Если в постоянном объекте есть поле, которое мыdon’t хотим сохранить в базе данных, мы можем объявить поле временным с помощью саннотации@Transient .

3.3. Отношения

ЗатемJPA specifies how we should manage relationships between different database tables в нашем приложении. Как мы видели, JPA обрабатывает это с помощью аннотаций. Есть четыре аннотации отношений, которые мы должны иметь в виду:

  1. @Один к одному

  2. @Один ко многим

  3. @ManyToOne

  4. @ManyToMany

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

@Entity
public class SteeringWheel {

    @OneToOne
    private Car car

    // getters and setters
}

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

3.4. Entity Manager

Наконец,javax.persistence.EntityManager class  определяет операции с базой данных и из нее. EntityManager contains common Create, Read, Update and Delete (CRUD) operations, которые являютсяpersisted для базы данных.

4. Реализация JPA

Со спецификацией JPA, определяющей, как и что нам следует сохранять, мы теперьneed to choose an implementation provider to supply the necessary code. Без такого провайдера нам пришлось бы реализовать все соответствующие классы, чтобы соответствовать JPA, и этоlot работы!

Есть множество провайдеров на выбор, каждый из которых показывает свои плюсы и минусы. When making a decision для использования, мы должныconsider a few of the following points:

  1. Срок исполнения проекта -*how long has the provider been around*, and how well documented is it?

  2. Подпроекты -*does the provider have any useful subprojects* for our new application?

  3. Поддержка сообщества -is there anyone to help us out when we end up with a critical bug?

  4. Бенчмаркинг -*how performant* is the implementation?

Хотя мы не будем углубляться в сравнительный анализ различных поставщиков JPA,JPA Performance Benchmark (JPAB) содержит ценную информацию об этом.

Разобравшись с этим, давайте кратко рассмотрим некоторых из ведущих поставщиков JPA.

5. зимовать

По своей сутиHibernate is an object-relational mapping tool that provides an implementation of JPA. Hibernate is one of the most mature JPA implementations вокруг, при поддержке огромного сообщества.

Он реализует все классыjavax.persistence , которые мы рассмотрели ранее в статье, а также предоставляет функциональные возможности, выходящие за рамки JPA -Hibernate tools,validation иsearch. Хотя эти специфичные для Hibernate API-интерфейсы могут быть полезны, они не нужны в приложениях, которым требуется только базовая функциональность JPA.

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

При выполнении контракта JPA@org.hibernate.annotations.Entity adds additional metadata that goes beyond JPA specification. Выполнение этого позволяет точно настроить постоянство сущности. Например, давайте посмотрим на несколько аннотаций, предлагаемыхHibernate that extends the functionality of @Entity:

  1. @Table allows us to specify the name of the table created for the entity

  2. @BatchSize -specifies the batch size when retrieving entities from the table

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

  1. Настраиваемые операторы CRUD с пометкой@SQLInsert, @SQLUpate and @SQLDelete 

  2. Поддержка мягкого удаления

  3. Неизменяемые сущности с саннотацией@Immutable 

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

EclipseLink, построенный Eclipse Foundation,provides an open-sourced JPA implementation. Кроме того, EclipseLinksupports a number of other persistence standards such as Java Architecture for XML Binding (JAXB).

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

Затем, сравнивая ту же реализацию аннотации@Entity, мы видим, что EclipseLink снова предлагаетdifferent extensions. Хотя для @BatchSize , как мы видели ранее, нет аннотации,EclipseLink offers other options that Hibernate doesn’t.

Например:

  1. @ReadOnly - указывает, что сущность для сохранения доступна только для чтения

  2. @Struct – defines the class to map to a database ‘struct' type

Чтобы узнать больше о том, что предлагает EclipseLink, перейдите на страницуguide on EclipseLink with Spring.

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

В этой статье мыlooked at the Java Persistence API, or JPA.

Наконец, мы исследовалиhow it differs from Hibernate and EclipseLink.