Что такое jpa java
Перейти к содержимому

Что такое jpa java

  • автор:

Hibernate — ORM, JPA, JPQL

ORM (Object-Relational Mapping, объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования. В объектно-ориентированном программировании объекты приложения представляют объекты реального мира. ORM предназначена для преобразования объектов в форму для их сохранения в файлах или базах данных, а также их дальнейшего извлечения в программе с сохранением свойств объектов и отношений между ними. Такие объекты называют «хранимыми» (persistent). ORM освобождает программиста от работы с SQL-скриптами и позволяет сосредоточиться на ООП.

В программе основой ORM является конфигурационный файл, в котором описывается порядок хранения объекта в БД. Если с обычными полями все прозрачно : строковое поле записывается в колонку с типом varchar, а целочисленное — в int, то со связями между объектами все гораздо интересней. Например, в программе используются классы «Город» и «Улица». Для обоих классов созданы конфигурационные файлы, в которых описаны их поля и связи с таблицами БД. Но кроме этого «Улица» имеет ссылку на «Город». В таком случае таблицы в БД будут связаны по внешнему ключу, что также должно быть описано в одном из конфигурационных файлов.

JPA — Java Persistence API, javax.persistence

Для сохранения Java-объектов в базе данных и чтения из БД следует использовать JPA. JPA (Java Persistence API) — программный интерфейс API, входящий с версии Java 5 в состав платформ Java SE и Java EE. Существует несколько реализаций интерфейса JPA, среди которых наиболее популярным является Hibernate.

Непосредственно JPA представлен в пакете javax.persistence и включает платформо-независимый объектно-ориентированный язык запросов JPQL.

JPA оперирует таким понятием, как сущность Entity, которая является POJO-классом и связана с БД с помощью аннотации @Entity или через файл конфигурации XML. К такому классу предъявляются следующие требования :

  • наличие пустого public или protected конструктора;
  • не должен быть вложенным, являться интерфейсом или enum;
  • не должен быть final и не должен содержать final-свойств;
  • должен включать хотя бы одно @Id-поле.

При этом сущность может иметь непустые конструкторы, наследоваться или быть наследованной, содержать методы, не связанные со свойствами (методы get/set), и реализовывать интерфейсы. Entities могут быть связаны друг с другом (один-к-одному, один-ко-многим, многие-к-одному и многие-ко-многим).

Примеры сущностей Entity

В самом простом виде (без методов определения и получения значения свойств) JPA сущности можно представить следующим образом :

@Entity public class Author < @Id private Integer id; private String firstName; private String lastName; @ManyToMany private Listbooks; > @Entity public class Book < @Id private Integer id; private String title; private String isbn; @ManyToOne private Publisher publisher; @ManyToMany private Listauthors; > @Entity public class Publisher < @Id private Integer id; private String name; private String address; @OneToMany(mappedBy = "publisher") private Listbooks; >

При описании сущностей были использованы аннотации. Пример использования аннотаций при описании сущности представлено здесь.

JPQL — Java Persistence Query Language

Java Persistence Query Language (JPQL) — платформо-независимый объектно-ориентированный язык запросов являющийся частью спецификации JPA.

JPQL используется для написания запросов к сущностям, хранящимся в реляционной базе данных. JPQL во многом похож на SQL, но в отличие от последнего, оперирует запросами, составленными по отношению к сущностям JPA, в отличие от прямых запросов к таблицам базы данных. В дополнение к получению объектов (запросы SELECT), JPQL поддерживает запросы, основанные на операторах UPDATE и DELETE. JPA реализует концепцию ORM.

JPQL основан на Hibernate Query Language (HQL), более раннем не стандартизованном языке запросов, включённом в библиотеку объектно-реляционного отображения Hibernate. Hibernate и HQL были созданы до появления спецификации JPA. JPQL является подмножеством языка запросов HQL.

Примеры JPQL

JPQL запрос получения списка авторов сущности «Author», упорядоченных в алфавитном порядке, имеет вид :

SELECT a FROM Author a ORDER BY a.firstName, a.lastName

Запрос получения списка авторов, когда-либо опубликованных издательством «Publisher Press» :

SELECT DISTINCT a FROM Author a INNER JOIN a.books b WHERE b.publisher.name = 'Publisher Press'

JPQL поддерживает именованные параметры, которые начинаются с символа двоеточия ‘:’. Следующая функция, возвращающая список авторов с определенной фамилией, будет иметь следующий вид :

import javax.persistence.Query; import javax.persistence.EntityManager; import org.apache.commons.lang.StringUtils; . @SuppressWarnings(«unchecked») public List

JPA и Spring Data JPA: отличия, связь с Hibernate

Java Persistence API (JPA) — это стандарт языка Java для управления реляционными данными в Java-приложениях. Этот стандарт обеспечивает удобный механизм взаимодействия с базой данных через объектно-реляционное отображение (ORM).

Spring Data JPA упрощает работу с JPA путём автоматизации написания повторяющегося кода. Этот фреймворк построен на основе JPA и предлагает упрощенное API для исполнения CRUD-операций и создания запросов на основе имён методов.

Пример JPA-сущности: java @Entity public class FunExampleEntity < @Id private Long id; // Поля, которые также требуются. >

Используя Spring Data JPA, мы можем определить репозиторий следующим образом: java public interface FunExampleEntityRepository extends JpaRepository < ListfindByFunPropertyName(String funPropertyName); >

С помощью Spring Data JPA:

  • код становится проще благодаря автоматической реализации стандартных операций доступа к данным;
  • репозитории включают базовый набор CRUD-операций;
  • происходит формирование запросов на основе имени метода, что избавляет от написания SQL-кода.

Особенности Spring Data JPA

Реализация шаблона «репозиторий» в Spring Data JPA

Spring Data JPA поддерживает шаблон репозитория, который является ключевым в Domain-Driven Design (DDD). Это позволяет создать чёткое разделение слоя данных, делая код более сжатым и управляемым. Интерфейсы репозиториев предоставляют операции CRUD, освобождая разработчиков для работы над бизнес-логикой.

Усовершенствованная система именования методов для запросов

Важной особенностью Spring Data JPA является создание запросов на основе наименований методов. Это позволяет экономить время и обеспечивает типобезопасный доступ к данным без дублирования SQL или JPQL кода. Для сложных запросов Spring Data поддерживает использование Querydsl и позволяет определять запросы на JPQL и SQL с помощью аннотации @Query .

Динамическая обработка данных: пагинация и сортировка

Spring Data JPA эффективно обрабатывает большие объемы данных благодаря поддержке пагинации и сортировки. Это делает приложения более отзывчивыми и производительными.

Аудит и проверка запросов для обеспечения надежности

В сложных системах крайне важно обеспечивать прозрачность операций CRUD. Spring Data JPA предоставляет возможности для аудита и валидации запросов, что значительно повышает качество и надежность приложения.

Независимость от конкретного JPA-провайдера

Spring Data JPA обеспечивает непрерывность работы между различными JPA-провайдерами, такими как Hibernate или EclipseLink, из-за своего абстрактного подхода к реализации.

Удобство настройки и интеграции

Spring Data JPA удобна в настройке благодаря поддержке конфигураций как на основе XML, так и на основе Java. Это позволяет с легкостью интегрировать фреймворк в любую рабочую среду.

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

Часто встает вопрос о разнице между Hibernate и JPA. Разъясним этот вопрос, чтобы помочь новичкам в Java понять, что такое JPA и Hibernate, и в чем между ними состоит разница.

В начале стоит отметить, что JPA (Java Persistence API) это спецификация, а Hibernate это реализация этой спецификации. Спецификация JPA предоставляет стандарты для ORM (Object-Relational Mapping) технологий в Java. Это означает, что JPA определяет набор правил и руководств по тому, как должен работать ORM-инструмент.

Hibernate, с другой стороны, это конкретная реализация этих правил и руководств. Hibernate не единственный ORM инструмент, который следует JPA спецификациям, есть другие, такие как EclipseLink, Apache OpenJPA и так далее.

Например, если разработчик хочет сохранить данные в базу данных, он может использовать JPA API для этого. Этот код будет работать независимо от того, какой ORM-инструмент используется в качестве JPA-провайдера, будь то Hibernate, EclipseLink или OpenJPA.

Однако Hibernate предлагает некоторые функции, которые не описаны в спецификации JPA. Эти функции доступны только при использовании Hibernate в качестве JPA-провайдера. Если разработчик хочет использовать эти дополнительные функции, он должен использовать Hibernate API, а не JPA API. В этом случае код больше не будет независимым от провайдера.

В заключение, можно сказать, что JPA и Hibernate не являются альтернативами друг другу. Скорее, они дополняют друг друга. Разработчики могут использовать JPA API для выполнения стандартных ORM-операций, и Hibernate API для выполнения дополнительных операций, которые не поддерживаются JPA.

Собеседование по Java EE — Java Persistence API (JPA) (вопросы и ответы). Часть 1

Общие вопросы и ответы о Java Persistence API — JPA. Часть 1.

Данный раздел был скопирован из статьи хабра https://habrahabr.ru/post/265061/, т.к. там рассмотрены многие стандартные, а также более углубленные темы.
Так же можете посмотреть раздел по Hibernate (фреймворк является реализацией JPA и темы взаимосвязанные), перейдя к списку вопросов раздела EE.

к списку вопросов раздела JEE

Вопросы

1. Что такое JPA?
2. В чем её отличие JPA от Hibernate?
3. Можно ли использовать JPA c noSQl базами?
4. В чем её отличие JPA от JDO?
5. Что такое Entity?
6. Может ли Entity класс наследоваться от не Entity классов (non-entity classes)?
7. Может ли Entity класс наследоваться от других Entity классов?
8. Может ли не Entity класс наследоваться от Entity класса?
9. Может ли Entity быть абстрактным классом?
10. Какие требования JPA к Entity классам вы можете перечислить (не менее шести требований)?
11. Какие два типа элементов есть у Entity классов. Или другими словами перечислите два типа доступа (access) к элементам Entity классов.
12. Что такое атрибут Entity класса в терминологии JPA?
13. Какие типы данных допустимы в атрибутах Entity класса (полях или свойствах)?
14. Какие типы данных можно использовать в атрибутах, входящих в первичный ключ Entity класса (составной или простой), чтобы полученный первичный ключ мог использоваться для любой базы данных? А в случае автогенерируемого первичного ключа (generated primary keys)?
15. Что такое встраиваемый (Embeddable) класс?
16. Может ли встраиваемый (Embeddable) класс содержать другой встраиваемый (Embeddable) класс?
17. Может ли встраиваемый (Embeddable) класс содержать связи (relationship) с другими Entity или коллекциями Entity? Если может, то существуют ли какие-то ограничение на такие связи (relationship)?
18. Какие требования JPA устанавливает к встраиваемым (Embeddable) классам?
19. Какие типы связей (relationship) между Entity вы знаете (перечислите восемь типов, либо укажите четыре типа связей, каждую из которых можно разделить ещё на два вида)?
20. Что такое Mapped Superclass?
21. Какие три типа стратегии наследования мапинга (Inheritance Mapping Strategies) описаны в JPA?
22. Какие два типа fetch стратегии в JPA вы знаете?
23. Что такое EntityManager и какие основные его функции вы можете перечислить?
24. Какие четыре статуса жизненного цикла Entity объекта (Entity Instance’s Life Cycle) вы можете перечислить?
25. Как влияет операция persist на Entity объекты каждого из четырех статусов?
26. Как влияет операция remove на Entity объекты каждого из четырех статусов?
27. Как влияет операция merge на Entity объекты каждого из четырех статусов?
28. Как влияет операция refresh на Entity объекты каждого из четырех статусов?
29. Как влияет операция detach на Entity объекты каждого из четырех статусов?

30. Для чего нужна аннотация Basic?
31. Для чего нужна аннотация Access?
32. Какими аннотациями можно перекрыть связи (override entity relationship) или атрибуты, унаследованные от суперкласса, или заданные в embeddable классе при использовании этого embeddable класса в одном из entity классов и не перекрывать в остальных?
33. Какой аннотацией можно управлять кешированием JPA для данного Entity?
34. Какие аннотации служит для задания класса преобразования basic атрибута Entity в другой тип при сохранении/получении данных их базы (например, работать с атрибутом Entity boolean типа, но в базу сохранять его как число)?
35. Какой аннотацией можно задать класс, методы которого должен выполнится при определенных JPA операциях над данным Entity или Mapped Superclass (такие как удаление, изменение данных и т.п.)?
36. Для чего нужны callback методы в JPA? К каким сущностям применяются аннотации callback методов? Перечислите семь callback методов (или что тоже самое аннотаций callback методов)
37. Какие аннотации служить для установки порядка выдачи элементов коллекций Entity?
38. Какой аннотацей можно исключить поля и свойства Entity из маппинга (property or field is not persistent)?
40. Какие два вида кэшей (cache) вы знаете в JPA и для чего они нужны?
41. Какие есть варианты настройки second-level cache (кэша второго уровня) в JPA или что аналогично опишите какие значения может принимать элемент shared-cache-mode из persistence.xml?
42. Как можно изменить настройки fetch стратегии любых атрибутов Entity для отдельных запросов (query) или методов поиска (find), то если у Entity есть атрибут с fetchType = LAZY, но для конкретного запроса его требуется сделать EAGER или наоборот?
43. Каким способом можно в коде работать с кэшем второго уровня (удалять все или определенные Entity из кеша, узнать закэшировался ли данное Entity и т.п.)?
44. Каким способом можно получить метаданные JPA (сведения о Entity типах, Embeddable и Managed классах и т.п.)?
45. Что такое JPQL (Java Persistence query language) и чем он отличается от SQL?
46. Что означает полиморфизм (polymorphism) в запросах JPQL (Java Persistence query language) и как его «выключить»?
47. Что такое Criteria API и для чего он используется?
48. В чем разница в требованиях к Entity в Hibernate, от требований к Entity, указанных в спецификации JPA (см. вопрос 10)?
49. Какая уникальная стратегия наследования есть в Hibernate, но нет в спецификации JPA?
50. Какие основные новые возможности появились в спецификации JPA 2.1 по сравнению с JPA 2.0 (перечислите хотя бы пять-шесть новых возможностей)?

Ответы

1. Что такое JPA?

JPA (Java Persistence API) это спецификация Java EE и Java SE, описывающая систему управления сохранением java объектов в таблицы реляционных баз данных в удобном виде. Сама Java не содержит реализации JPA, однако существует много реализаций данной спецификации от разных компаний (открытых и нет). Это не единственный способ сохранения java объектов в базы данных (ORM систем), но один из самых популярных в Java мире.

2. В чем её отличие JPA от Hibernate?

Hibernate одна из самых популярных открытых реализаций последней версии спецификации (JPA 2.1). Даже скорее самая популярная, почти стандарт де-факто. То есть JPA только описывает правила и API, а Hibernate реализует эти описания, впрочем у Hibernate (как и у многих других реализаций JPA) есть дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации JPA).

3. Можно ли использовать JPA c noSQl базами?

Вообще, спецификация JPA говорит только об отображении java объектов в таблицы реляционных баз данных, но при этом существует ряд реализаций данного стандарта для noSql баз данных: Kundera, DataNucleus, ObjectDB и ряд других. Естественно, при этом не все специфичные для реляционных баз данных особенности спецификации переносятся на nosql базы полностью.

4. В чем её отличие JPA от JDO?

JPA (Java Persistence API) и Java Data Objects (JDO) две спецификации сохранения java объектов в базах данных. Если JPA сконцентрирована только на реляционных базах, то JDO более общая спецификация которая описывает ORM для любых возможных баз и хранилищ. В принципе можно рассматривать JPA как специализированную на реляционных баз часть спецификации JDO, даже при том что API этих двух спецификаций не полностью совпадает. Также отличаются «разработчики» спецификаций — если JPA разрабатывается как JSR, то JDO сначала разрабатывался как JSR, теперь разрабатывается как проект Apache JDO.

5. Что такое Entity?

Entity это легковесный хранимый объект бизнес логики (persistent domain object). Основная программная сущность это entity класс, который так же может использовать дополнительные классы, которые могут использоваться как вспомогательные классы или для сохранения состояния еntity.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *