Как правило,Java Persistence APIобрати внимание наУпорство, который отделяет процесс создания объектов Java от конкретной формы создания. Не все объекты Java должны быть постоянными, но большинство приложений сохраняют ключевые бизнес-объекты. Спецификация JPA позволяет определить, что должно быть сохранено.которыйОбъекты икакСохраните эти объекты в своем Java-приложении.
JPA сама по себе не является инструментом или инфраструктурой; скорее, она определяет набор концепций, которые могут быть реализованы любым инструментом или инфраструктурой. Хотя модель объектно-реляционного отображения JPA (ORM) изначально была основана наHibernate, но он развился. Кроме того, хотя JPA изначально предназначался для реляционных баз данных/SQL, некоторые реализации JPA были расширены для хранения данных NoSQL. Популярные фреймворки, поддерживающие JPA и NoSQL,EclipseLink, которая является эталонной реализацией для JPA 2.2.
JPA и Hibernate
Hibernate и JPA часто путают из-за их взаимосвязанных историй. Однако сJava ServletКак и спецификация, JPA создала множество совместимых инструментов и фреймворков, Hibernate — лишь один из них.
HibernateРазработанная Гэвином Кингом и выпущенная в начале 2002 года, это библиотека ORM для Java. Кинг разработал Hibernate какПостоянные компоненты сущностейиззаменять.该框架非常受欢迎,当时非常需要,它的许多想法都在第一个JPA规范中被采用和编纂。
сегодня,Hibernate ORMявляется одной из наиболее зрелых реализаций JPA и остается популярным вариантом для ORM в Java.Hibernate ORM 5.3.8(текущая версия на момент написания этой статьи) реализует JPA 2.2. Кроме того, семейство инструментов Hibernate было расширено за счет включенияHibernate Search,Hibernate ValidatorиHibernate OGMи другие популярные инструменты, которые поддерживают постоянство модели предметной области NoSQL.
Что такое Java ORM?
Хотя они работают по-разному, но каждая реализация JPA предоставляет некоторый уровень ORM. Чтобы понять JPA и JPA-совместимый инструмент, вам нужно иметь ORM.Объект реляционного отображения являетсяЗадача- У разработчиков есть веские причины не делать это вручную. Фреймворки, такие как Hibernate ORM или EclipseLink, кодируют эту задачу как библиотеку или фреймворк, т.е.ORM-слой. Как часть архитектуры приложения, уровень ORM отвечает за управление преобразованием программных объектов для взаимодействия с таблицами и столбцами в реляционной базе данных. В Java уровень ORM преобразует классы и объекты Java, чтобы их можно было хранить и управлять ими в реляционной базе данных.
По умолчанию имя постоянного объекта будет именем таблицы, а поля будут столбцами. После настройки таблицы каждая строка таблицы соответствует объекту в приложении. Сопоставление объектов настраивается, но значения по умолчанию, как правило, работают хорошо.
Рисунок 1 иллюстрирует роль слоев JPA и ORM в разработке приложений.
Настройте уровень Java ORM
При настройке нового проекта для использования JPA необходимо настроить хранилище данных и поставщика JPA. вы будете настраиватьразъем для хранения данныхдля подключения к базе данных по вашему выбору (SQL или NoSQL). Вы также включите и настроитеJPA-провайдер, это фреймворк наподобие Hibernate или EclipseLink. Хотя вы можете настроить JPA вручную, многие разработчики предпочитают использовать стандартную поддержку Spring. Демонстрацию установки и настройки JPA вручную и на основе Spring см. в разделе "Установка и настройка JPA".
Объекты данных Java
Java Data Objects — это стандартизированная структура персистентности, которая отличается от JPA главным образом поддержкой логики персистентности в объектах и давней поддержкой использования нереляционных хранилищ данных. JPA и JDO достаточно похожи, поэтому поставщики JDO часто также поддерживают JPA. видетьJDO-проект Apacheчтобы узнать больше о JDO по отношению к другим стандартам сохраняемости, таким как JPA и JDBC.
Сохранение данных в Java
С точки зрения программирования уровень ORM представляет собойпереходный слой: Он адаптирует язык графов объектов к языку SQL и реляционных таблиц. Уровень ORM позволяет объектно-ориентированным разработчикам создавать программное обеспечение, сохраняющее данные, не выходя за рамки объектно-ориентированной парадигмы.
При использовании JPA можно создать массив объектов модели данных из хранилища данных в приложение.карта. Вместо определения того, как объекты сохраняются и извлекаются, вы можете определить сопоставление между объектами и базой данных, а затем вызвать JPA для их сохранения. Если вы используете реляционную базу данных, большая часть фактического соединения между кодом приложения и базой данных будет выполняться JDBC (API подключения к базе данных Java) обработка.В качестве спецификации JPA предоставляетаннотация метаданных, который можно использовать для определения сопоставлений между объектами и базами данных. Каждая реализация JPA предоставляет собственный механизм для аннотаций JPA. Спецификация JPA также обеспечиваетPersistanceManager
илиEntityManager
, они являются ключевыми точками контакта с системой JPA (где код бизнес-логики сообщает системе, что делать с отображенными объектами).
Чтобы сделать все это более конкретным, рассмотрим листинг 1, простой класс данных для моделирования музыкантов.
Листинг 1. Простой класс данных в Java
public class Musician {
private Long id;
private String name;
private Instrument mainInstrument;
private ArrayList performances = new ArrayList<Performance>();
public Musician( Long id, String name){ /* constructor setters... */ }
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setMainInstrument(Instrument instr){
this.instrument = instr;
}
public Instrument getMainInstrument(){
return this.instrument;
}
// ...Other getters and setters...
}
в листинге 1Musician
Классы используются для хранения данных. Он может содержать необработанные данные, такие какназваниеполе. Его также можно использовать с другими классами, такими какmainInstrument
иperformances
) сохранить отношения.
Musician
существующийпричинасодержит данные. Этот класс иногда называют Dто илиобъект передачи данных. DTO — распространенная функция в разработке программного обеспечения. Хотя они содержат различные данные, они не содержат никакой бизнес-логики. Постоянные объекты данных — повсеместная проблема в разработке программного обеспечения.
Сохранение данных JDBC
будетMusician
Одним из способов сохранения экземпляра класса в реляционной базе данных является использование библиотеки JDBC. JDBC — это уровень абстракции, который позволяет приложениям выполнять команды SQL независимо от базовой реализации базы данных.
В листинге 2 показано, как использовать JDBC для сохраняемости.Musician
своего рода.
Листинг 2. JDBC для вставки записей
Musician georgeHarrison = new Musician(0, "George Harrison");
String myDriver = "org.gjt.mm.mysql.Driver";
String myUrl = "jdbc:mysql://localhost/test";
Class.forName(myDriver);
Connection conn = DriverManager.getConnection(myUrl, "root", "");
String query = " insert into users (id, name) values (?, ?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt (1, 0);
preparedStmt.setString (2, "George Harrison");
preparedStmt.setString (2, "Rubble");
preparedStmt.execute();
conn.close();
// Error handling removed for brevity
Код в листинге 2 достаточно самодокументирован. ДолженgeorgeHarrison
Объекты могут поступать откуда угодно (представления внешнего интерфейса, внешние службы и т. д.) и иметь установленные поля идентификатора и имени. Поля объекта затем используются для предоставления SQLinsert
Значение заявления. (PreparedStatement
Этот класс является частью JDBC и предоставляет способ безопасного применения значений к SQL-запросам. )
Хотя JDBC позволяет вручную настраивать включенные элементы управления, это громоздко по сравнению с JPA. Чтобы изменить базу данных, сначала необходимо создать запрос SQL, который сопоставляет объекты Java с таблицами в реляционной базе данных. Затем всякий раз, когда изменяется сигнатура объекта, необходимо модифицировать SQL. С JDBC поддержка SQL становится самостоятельной задачей.
Сохранение данных с JPA
Теперь рассмотрим листинг 3, мы используем постоянство JPA.Musician
своего рода.
Листинг 3. Сохранение Джорджа Харрисона с помощью JPA
Musician georgeHarrison = new Musician(0, "George Harrison");
musicianManager.save(georgeHarrison);
В листинге 3 используется одна строкаsession.save()
Заменен ручной SQL в листинге 2, который указывает JPA сохранять объект. С этого момента преобразование SQL обрабатывается платформой, поэтому вам никогда не придется отказываться от объектно-ориентированной парадигмы.
Метаданные аннотации в JPA
Листинг 3настроитьрезультат,настроитьиспользует JPAПримечаниясозданный. Разработчики используют аннотации, чтобы указать JPA, какие объекты следует сохранить и как их сохранить.
В листинге 4 показано, что с одной аннотацией JPAMusician
своего рода.
Листинг 4. Аннотация JPA @Entity
@Entity
public class Musician {
// ..class body
}
постоянные объекты иногда называюторганизация. дополнительный@Entity
к классу,Musician
Сообщает JPA, что этот класс и его объекты должны быть сохранены.
Настроить JPA
Как и большинство современных фреймворков, JPAКодирование по соглашению(также известный как соглашение по конфигурации), когда платформа предоставляет конфигурации по умолчанию на основе лучших отраслевых практик. Например, по имениMusician
Класс по умолчанию сопоставляется с классом с именемMusicianтаблица базы данных.
Традиционная конфигурация - сэкономить время, а во многих случаях он хорошо работает. Вы также можете настроить конфигурацию JPA. Например, вы можете использовать JPA@Table
Аннотация, чтобы указать, что должно быть сохраненоMusician
классный стол.
Листинг 5. Аннотация JPA @Table
@Entity
@Table(name="musician")
public class Musician {
// ..class body
}
В листинге 5 JPA сообщает JPA преобразовать сущность (Musician
класс) сохраняется доmusician
в таблице.
первичный ключ
В JPA,первичный ключполе, используемое для уникальной идентификации каждого объекта в базе данных. Первичные ключи можно использовать для ссылки на объекты и связывания их с другими объектами. Всякий раз, когда вы сохраняете объект в таблице, вы также указываете поле, которое будет использоваться в качестве его первичного ключа.
В листинге 6 мы сообщаем JPA, какое поле использовать в качествеMusician
первичный ключ.
Листинг 6. Указание первичного ключа
@Entity
public class Musician {
@Id
private Long id;
В этом случае мы используем JPA@Id
Аннотация Уиллid
Обозначение поляMusician
первичный ключ. По умолчанию эта конфигурация предполагает, что первичный ключ будет установлен базой данных — например, когда для поля в таблице задано автоматическое увеличение.
JPA поддерживает другие стратегии генерации первичных ключей объектов. Он также имеет аннотации для изменения имен отдельных полей. Как правило, JPA достаточно гибок, чтобы приспособить любое сопоставление постоянства, которое может вам понадобиться.
CRUD-операции
Как только вы сопоставите класс с таблицей базы данных и установите его первичный ключ, у вас будет все необходимое для создания, извлечения, удаления и обновления этого класса в базе данных. перечислитьsession.save()
Указанный класс будет создан или обновлен в зависимости от того, имеет ли поле первичного ключа значение null или применимо к существующему объекту. перечислитьentityManager.remove()
Указанный класс будет удален.
Отношения сущностей в JPA
Простое сохранение объектов с примитивными полями — это только половина уравнения. JPA также имеет возможность управлять объектами, связанными друг с другом. Как в таблицах, так и в объектах существует четыре типа отношений сущностей:
- один ко многим
- много к одному
- многие ко многим
- один к одному
Каждый тип отношения описывает отношение объекта к другим объектам. Например,Musician
Сущности могут быть связаны сList
илиSet
Коллекция сущностей, представляющих сущности сотношение один ко многим.
еслиMusician
содержитBand
поле, отношения между этими сущностями могут бытьмного к одному, что означает, что в одномBand
класс имеетMusician集合
. (Предположим, что каждый музыкант играет только в одной группе.)
еслиMusician
ВключаютBandMates
поле, его можно выразить с помощью другихMusician
организацияотношение многие ко многим.
Наконец,Musician
Может быть сQuote
сущность имеетотношение один к одномуИспользуется для обозначения известной цитаты:Quote famousQuote = new Quote()
.
Определите тип отношений
JPA предоставляет аннотации для каждого типа реляционного отображения. В листинге 7 показано, как аннотироватьMusician
иPerformance
Отношение один ко многим между s.
Листинг 7. Аннотирование отношения «один ко многим»
public class Musician {
@OneToMany
@JoinColumn(name="musicianId")
private List<Performance> performances = new ArrayList<Performance>();
//...
}
Следует отметить, что@JoinColumn
скажите JPAPerformanceКакой столбец в таблице будет отображаться наMusician
организация. Каждое выступление будет сравниваться с однимMusician
ассоциация, которая отслеживается в этом столбце. Когда JPA ставитMusician
илиPerformance
При загрузке в базу данных он будет использовать эту информацию для перестроения графа объектов.
Получить политику в JPA
помимо знаниясуществуетВ дополнение к тому, где в базе данных размещать связанные объекты, JPA необходимо знатькакзагрузить их.
Musician
Есть классbandMate
поля (показаны в листинге 7), загрузитьgeorge
может вызвать весьMusicianТаблица загружается из базы данных!
Нам нужно определить связанные объектыленивая загрузкаспособность - конечно, распознаватьJPAсерединаотношения могут быть страстными илиленивый. Вы можете использовать аннотации для настройки стратегии извлечения, но стандартную конфигурацию JPA обычно можно использовать «из коробки» без изменений:
- Один ко многим: ленивый
- Многие к одному: нетерпеливый
- Многие ко многим: ленивый
- Один на один: нетерпеливый
Установка и настройка JPA
Наконец, мы кратко опишем, как установить и установить JPA для приложений Java. В этой демонстрации я буду использовать ECLIPSELINK, а именно реализацию справочной реализации JPA.Обычный способ установки JPA — в проектеВключаютJPA-провайдер. В листинге 8 показано, как использовать EclipseLink в качестве Maven.pom.xml
Зависимости в файле включены.
Листинг 8. Включение EclipseLink в качестве зависимости Maven
org.eclipse.persistence
eclipselink
2.5.0-RC1
Вам также потребуется драйвер, включающий базу данных, как показано в листинге 9.
Листинг 9. Зависимые от Maven зависимые отношения между разъемом MySQL
mysql
mysql-connector-java
5.1.32
Далее вам нужно сообщить системе вашу базу данных и провайдера. это вpersistence.xml
файл, как показано в листинге 10.
Листинг 10. Persistence.xml
http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="MyUnit" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/foo_bar"/>
<property name="javax.persistence.jdbc.user" value=""/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
Есть и другие способы предоставления этой информации в систему, в том числе программно. Я рекомендую использовать этоpersistence.xml
файл, потому что такое хранение зависимостей позволяет очень легко обновлять приложение без изменения кода.
Конфигурация JPA Spring
使用Spring将极大地简化JPA与应用程序的集成。 Например, будет@SpringBootApplication
Аннотации, размещенные в заголовке приложения, предписывают Spring автоматически сканировать классы на основе указанной вами конфигурации и внедрять их по мере необходимости.EntityManager
.
В листинге 11 показаны зависимости, которые необходимо включить, если вы хотите, чтобы Spring обеспечивал поддержку JPA для вашего приложения.
Листинг 11. Добавление поддержки Spring JPA в Maven
org.springframework.boot
spring-boot-starter
2.1.3.RELEASE
org.springframework.boot
spring-boot-starter-data-jpa
2.1.3.RELEASE
в заключении
Каждое приложение, имеющее дело с базами данных, должно определять прикладной уровень, единственной целью которого является изоляция сохраняемого кода. Как видно из этой статьи, Java Persistence API представляет ряд функций и поддерживает сохранение объектов Java. Простым приложениям могут не понадобиться все функции JPA, а в некоторых случаях накладные расходы на настройку фреймворка могут оказаться неоправданными. Однако структура и инкапсуляция JPA остаются неизменными по мере роста приложения. Использование JPA упрощает объектный код и предоставляет традиционную структуру для доступа к данным в приложениях Java.
Английский Оригинал:Woohoo. Java world.com/article/337…
Общедоступный номер: Galaxy № 1
Контактный адрес электронной почты: public@space-explore.com
(Пожалуйста, не перепечатывайте без разрешения)