Учебники

JPA — Краткое руководство

JPA — Введение

Любое корпоративное приложение выполняет операции с базой данных, сохраняя и извлекая огромные объемы данных. Несмотря на все доступные технологии для управления хранением, разработчики приложений обычно изо всех сил пытаются выполнить операции базы данных эффективно.

Как правило, Java-разработчики используют много кода или используют проприетарную среду для взаимодействия с базой данных, тогда как при использовании JPA нагрузка на взаимодействие с базой данных значительно снижается. Он образует мост между объектными моделями (программа Java) и реляционными моделями (программа базы данных).

Несоответствия между реляционными и объектными моделями

Реляционные объекты представлены в табличном формате, а объектные модели представлены в виде взаимосвязанного графа формата объекта. При сохранении и извлечении объектной модели из реляционной базы данных возникает некоторое несоответствие по следующим причинам:

  • Гранулярность : объектная модель обладает большей гранулярностью, чем реляционная модель.

  • Подтипы : Подтипы (означает наследование) поддерживаются не всеми типами реляционных баз данных.

  • Идентичность : как и объектная модель, реляционная модель не раскрывает идентичность при написании равенства.

  • Ассоциации : реляционные модели не могут определять множественные отношения при рассмотрении модели предметной области.

  • Навигация данных. Навигация данных между объектами в объектной сети различна в обеих моделях.

Гранулярность : объектная модель обладает большей гранулярностью, чем реляционная модель.

Подтипы : Подтипы (означает наследование) поддерживаются не всеми типами реляционных баз данных.

Идентичность : как и объектная модель, реляционная модель не раскрывает идентичность при написании равенства.

Ассоциации : реляционные модели не могут определять множественные отношения при рассмотрении модели предметной области.

Навигация данных. Навигация данных между объектами в объектной сети различна в обеих моделях.

Что такое JPA?

Java Persistence API — это набор классов и методов для постоянного хранения огромных объемов данных в базе данных, предоставляемой корпорацией Oracle.

Где использовать JPA?

Чтобы уменьшить нагрузку на написание кодов для управления реляционными объектами, программист следует структуре «JPA Provider», которая позволяет легко взаимодействовать с экземпляром базы данных. Здесь необходимые рамки приняты JPA.

JPA

JPA История

В более ранних версиях EJB определенный уровень персистентности сочетался с уровнем бизнес-логики с использованием интерфейса javax.ejb.EntityBean.

  • При внедрении EJB 3.0 уровень персистентности был отделен и определен как JPA 1.0 (Java Persistence API). Спецификации этого API были выпущены вместе со спецификациями JAVA EE5 11 мая 2006 года с использованием JSR 220.

  • JPA 2.0 был выпущен со спецификациями JAVA EE6 10 декабря 2009 года как часть процесса сообщества Java JSR 317.

  • JPA 2.1 был выпущен со спецификацией JAVA EE7 22 апреля 2013 года с использованием JSR 338.

При внедрении EJB 3.0 уровень персистентности был отделен и определен как JPA 1.0 (Java Persistence API). Спецификации этого API были выпущены вместе со спецификациями JAVA EE5 11 мая 2006 года с использованием JSR 220.

JPA 2.0 был выпущен со спецификациями JAVA EE6 10 декабря 2009 года как часть процесса сообщества Java JSR 317.

JPA 2.1 был выпущен со спецификацией JAVA EE7 22 апреля 2013 года с использованием JSR 338.

JPA провайдеры

JPA является API с открытым исходным кодом, поэтому различные корпоративные поставщики, такие как Oracle, Redhat, Eclipse и т. Д., Предоставляют новые продукты, добавляя в них постоянство JPA. Некоторые из этих продуктов включают в себя:

Hibernate, Eclipselink, Toplink, Spring Data JPA и т. Д.

JPA — Архитектура

Java Persistence API является источником для хранения бизнес-сущностей как реляционных сущностей. В нем показано, как определить объект PLAIN OLD JAVA (POJO) как объект и как управлять объектами с отношениями.

Архитектура уровня класса

На следующем рисунке показана архитектура уровня класса JPA. Он показывает основные классы и интерфейсы JPA.

Архитектура уровня класса JPA

В следующей таблице описан каждый из блоков, показанных в приведенной выше архитектуре.

Единицы Описание
EntityManagerFactory Это фабричный класс EntityManager. Он создает и управляет несколькими экземплярами EntityManager.
EntityManager Это интерфейс, он управляет операциями сохранения на объектах. Это работает как фабрика для экземпляра Query.
сущность Сущности — это постоянные объекты, хранящиеся в виде записей в базе данных.
EntityTransaction Он имеет непосредственное отношение к EntityManager. Для каждого EntityManager операции поддерживаются классом EntityTransaction.
Упорство Этот класс содержит статические методы для получения экземпляра EntityManagerFactory.
запрос Этот интерфейс реализуется каждым поставщиком JPA для получения реляционных объектов, соответствующих критериям.

Указанные выше классы и интерфейсы используются для хранения сущностей в базе данных в качестве записи. Они помогают программистам, сокращая их усилия по написанию кодов для хранения данных в базе данных, чтобы они могли сосредоточиться на более важных действиях, таких как написание кодов для отображения классов с таблицами базы данных.

JPA Классовые Отношения

В приведенной выше архитектуре отношения между классами и интерфейсами принадлежат пакету javax.persistence. Следующая диаграмма показывает отношения между ними.

JPA Классовые Отношения

  • Отношения между EntityManagerFactory и EntityManager одно-ко-многим . Это фабричный класс для экземпляров EntityManager.

  • Отношения между EntityManager и EntityTransaction являются взаимно-однозначными . Для каждой операции EntityManager существует экземпляр EntityTransaction.

  • Отношения между EntityManager и Query одно-ко-многим . Многие запросы могут быть выполнены с использованием одного экземпляра EntityManager.

  • Отношения между EntityManager и Entity один-ко-многим . Один экземпляр EntityManager может управлять несколькими объектами.

Отношения между EntityManagerFactory и EntityManager одно-ко-многим . Это фабричный класс для экземпляров EntityManager.

Отношения между EntityManager и EntityTransaction являются взаимно-однозначными . Для каждой операции EntityManager существует экземпляр EntityTransaction.

Отношения между EntityManager и Query одно-ко-многим . Многие запросы могут быть выполнены с использованием одного экземпляра EntityManager.

Отношения между EntityManager и Entity один-ко-многим . Один экземпляр EntityManager может управлять несколькими объектами.

JPA — ORM Компоненты

Большинство современных приложений используют реляционную базу данных для хранения данных. В последнее время многие поставщики перешли на объектную базу данных, чтобы снизить нагрузку на обслуживание данных. Это означает, что объектная база данных или объектно-реляционные технологии заботятся о хранении, извлечении, обновлении и обслуживании данных. Основная часть этой объектно-реляционной технологии — это отображение файлов orm.xml. Поскольку xml не требует компиляции, мы можем легко вносить изменения в несколько источников данных с меньшими затратами на администрирование.

Реляционное сопоставление объектов

Объектно-реляционное сопоставление (ORM) кратко рассказывает о том, что такое ORM и как оно работает. ORM — это возможность программирования для преобразования данных из типа объекта в реляционный тип и наоборот.

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

Расширенные возможности

  • Идиоматическое постоянство : оно позволяет вам писать постоянные классы, используя объектно-ориентированные классы.

  • Высокая производительность : у него много методов извлечения и многообещающих методов блокировки.

  • Надежный : он очень стабилен и используется многими профессиональными программистами.

Идиоматическое постоянство : оно позволяет вам писать постоянные классы, используя объектно-ориентированные классы.

Высокая производительность : у него много методов извлечения и многообещающих методов блокировки.

Надежный : он очень стабилен и используется многими профессиональными программистами.

Архитектура ORM

Архитектура ORM выглядит следующим образом.

Реляционное сопоставление объектов

Вышеприведенная архитектура объясняет, как данные объекта хранятся в реляционной базе данных в три этапа.

Фаза 1

Первая фаза, называемая фазой данных объекта , содержит классы POJO, интерфейсы служб и классы. Это слой основного бизнес-компонента, который имеет операции и атрибуты бизнес-логики.

Например, давайте возьмем базу данных сотрудников в качестве схемы.

  • Класс POJO сотрудника содержит такие атрибуты, как идентификатор, имя, зарплата и обозначение. Он также содержит такие методы, как setter и getter этих атрибутов.

  • Классы DAO / Service для сотрудников содержат методы обслуживания, такие как создание сотрудников, поиск сотрудников и удаление сотрудников.

Класс POJO сотрудника содержит такие атрибуты, как идентификатор, имя, зарплата и обозначение. Он также содержит такие методы, как setter и getter этих атрибутов.

Классы DAO / Service для сотрудников содержат методы обслуживания, такие как создание сотрудников, поиск сотрудников и удаление сотрудников.

Фаза 2

Вторая фаза, называемая фазой отображения или сохранения , содержит провайдера JPA, файл отображения (ORM.xml), загрузчик JPA и объектную сетку.

  • JPA Provider : это продукт поставщика, который содержит разновидность JPA (javax.persistence). Например, Eclipselink, Toplink, Hibernate и т. Д.

  • Файл отображения: файл отображения (ORM.xml) содержит конфигурацию отображения между данными в классе POJO и данными в реляционной базе данных.

  • JPA Loader : JPA Loader работает как кеш-память. Может загружать данные реляционной сетки. Он работает как копия базы данных для взаимодействия с классами обслуживания для данных POJO (атрибуты класса POJO).

  • Сетка объектов : это временное расположение, в котором может храниться копия реляционных данных, например, кэш-память. Все запросы к базе данных сначала выполняются на данных в сетке объектов. Только после фиксации это влияет на основную базу данных.

JPA Provider : это продукт поставщика, который содержит разновидность JPA (javax.persistence). Например, Eclipselink, Toplink, Hibernate и т. Д.

Файл отображения: файл отображения (ORM.xml) содержит конфигурацию отображения между данными в классе POJO и данными в реляционной базе данных.

JPA Loader : JPA Loader работает как кеш-память. Может загружать данные реляционной сетки. Он работает как копия базы данных для взаимодействия с классами обслуживания для данных POJO (атрибуты класса POJO).

Сетка объектов : это временное расположение, в котором может храниться копия реляционных данных, например, кэш-память. Все запросы к базе данных сначала выполняются на данных в сетке объектов. Только после фиксации это влияет на основную базу данных.

Фаза 3

Третья фаза — это фаза реляционных данных . Он содержит реляционные данные, которые логически связаны с бизнес-компонентом. Как обсуждалось выше, только когда бизнес-компонент фиксирует данные, они физически сохраняются в базе данных. До этого модифицированные данные хранятся в кэш-памяти в виде формата сетки. Процесс получения данных идентичен процессу хранения данных.

Механизм программного взаимодействия указанных трех фаз называется объектным реляционным отображением .

Mapping.xml

Файл mapping.xml должен дать указание поставщику JPA сопоставить классы сущностей с таблицами базы данных.

Давайте рассмотрим пример объекта Employee, который содержит четыре атрибута. Класс POJO объекта Employee с именем Employee.java выглядит следующим образом:

public class Employee 
{
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
    public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
}

Приведенный выше код является классом POJO сущности Employee. Он содержит четыре атрибута eid , ename , salary и deg . Рассмотрите эти атрибуты как поля таблицы в таблице, а eid — как первичный ключ этой таблицы. Теперь мы должны спроектировать файл отображения hibernate для него. Файл сопоставления с именем mapping.xml выглядит следующим образом:

<? xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
                        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                        version="1.0">
    <description> XML Mapping file</description>
    <entity class="Employee">        
        <table name="EMPLOYEETABLE"/>
        <attributes>
            <id name="eid">
                <generated-value strategy="TABLE"/>
            </id>
            <basic name="ename">
                <column name="EMP_NAME" length="100"/>
            </basic>
            <basic name="salary">
            </basic>
            <basic name="deg">
            </basic>
        </attributes>
    </entity>
</entity-mappings>

Приведенный выше скрипт используется для отображения класса сущности с таблицей базы данных. В этом файле

  • <entity-mappings> : тег определяет определение схемы, чтобы разрешить теги объекта в XML-файл.

  • <description> : тег предоставляет описание приложения.

  • <entity> : тег определяет класс сущности, который вы хотите преобразовать в таблицу в базе данных. Класс атрибута определяет имя класса сущности POJO.

  • <table> : тег определяет имя таблицы. Если вы хотите иметь одинаковые имена как для класса, так и для таблицы, то этот тег не обязателен.

  • <attribute> : тег определяет атрибуты (поля в таблице).

  • <id> : тег определяет первичный ключ таблицы. Тег <Генерируемое значение> определяет, как назначить значение первичного ключа, например, Автоматический , Ручной или взятый из Последовательности .

  • <basic> : тег используется для определения оставшихся атрибутов для таблицы.

  • <имя-столбца> : тег используется для определения пользовательских имен полей таблицы в таблице.

<entity-mappings> : тег определяет определение схемы, чтобы разрешить теги объекта в XML-файл.

<description> : тег предоставляет описание приложения.

<entity> : тег определяет класс сущности, который вы хотите преобразовать в таблицу в базе данных. Класс атрибута определяет имя класса сущности POJO.

<table> : тег определяет имя таблицы. Если вы хотите иметь одинаковые имена как для класса, так и для таблицы, то этот тег не обязателен.

<attribute> : тег определяет атрибуты (поля в таблице).

<id> : тег определяет первичный ключ таблицы. Тег <Генерируемое значение> определяет, как назначить значение первичного ключа, например, Автоматический , Ручной или взятый из Последовательности .

<basic> : тег используется для определения оставшихся атрибутов для таблицы.

<имя-столбца> : тег используется для определения пользовательских имен полей таблицы в таблице.

Аннотации

Обычно XML-файлы используются для настройки определенных компонентов или сопоставления двух различных спецификаций компонентов. В нашем случае мы должны поддерживать XML-файлы отдельно в рамках. Это означает, что при написании файла сопоставления xml нам нужно сравнить атрибуты класса POJO с тегами сущностей в файле mapping.xml.

Вот решение. В определении класса мы можем написать часть конфигурации, используя аннотации. Аннотации используются для классов, свойств и методов. Аннотации начинаются с символа «@». Аннотации объявляются до класса, свойства или метода. Все аннотации JPA определены в пакете javax.persistence .

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

аннотирование Описание
@Сущность Объявляет класс как сущность или таблицу.
@Таблица Объявляет имя таблицы.
@Basic Задает необязательные поля в явном виде.
@Embedded Определяет свойства класса или объекта, значение которого является экземпляром встраиваемого класса.
@Я бы Определяет свойство, используемое для идентификации (первичный ключ таблицы) класса.
@GeneratedValue Определяет, как атрибут идентичности может быть инициализирован, например, автоматический, ручной или значение, взятое из таблицы последовательности.
@Transient Определяет свойство, которое не является постоянным, т. Е. Значение никогда не сохраняется в базе данных.
@column Определяет атрибут столбца для свойства постоянства.
@SequenceGenerator Задает значение для свойства, указанного в аннотации @GeneratedValue. Это создает последовательность.
@TableGenerator Указывает генератор значений для свойства, указанного в аннотации @GeneratedValue. Создает таблицу для генерации стоимости.
@AccessType Этот тип аннотации используется для установки типа доступа. Если вы устанавливаете @AccessType (FIELD), то доступ происходит по полю. Если вы установите @AccessType (PROPERTY), то доступ будет происходить по свойству.
@JoinColumn Определяет ассоциацию объекта или коллекцию объектов. Это используется в ассоциациях «многие к одному» и «один ко многим».
@Уникальное ограничение Определяет поля и уникальные ограничения для первичной или вторичной таблицы.
@ColumnResult Ссылается на имя столбца в запросе SQL, используя предложение select.
@ManyToMany Определяет отношение «многие ко многим» между таблицами объединения.
@ManyToOne Определяет отношение многие-к-одному между таблицами соединения.
@Один ко многим Определяет отношение «один ко многим» между таблицами объединения.
@Один к одному Определяет отношение один к одному между таблицами соединения.
@NamedQueries указывает список именованных запросов.
@NamedQuery Определяет запрос с использованием статического имени.

Java Bean Standard

Класс Java инкапсулирует значения экземпляров и их поведение в единый модуль, называемый объектом. Java Bean — это временное хранилище и компонент многократного использования или объект. Это сериализуемый класс, который имеет конструктор по умолчанию и методы получения и установки для индивидуальной инициализации атрибутов экземпляра.

Бобовые Соглашения

  • Бин содержит конструктор по умолчанию или файл, содержащий сериализованный экземпляр. Следовательно, бин может создавать другой бин.

  • Свойства bean-компонента могут быть разделены на булевы или не-булевы свойства.

  • Не булево свойство содержит методы получения и установки.

  • Логическое свойство содержит сеттер и является методом.

  • Метод получения любого свойства должен начинаться с маленькой буквы get (соглашение о методе java) и продолжаться именем поля, которое начинается с заглавной буквы. Например, именем поля является salary, поэтому метод получения этого поля — getSalary () .

  • Метод установки любого свойства должен начинаться с небольшого набора букв (соглашение о методе java), продолжаясь именем поля, которое начинается с заглавной буквы, и значением аргумента, которое нужно установить в поле. Например, именем поля является salary, поэтому метод установки этого поля — setSalary (double sal) .

  • Для логического свойства — это метод для проверки, является ли оно истинным или ложным. Например, логическое свойство пустое , метод is этого поля isEmpty () .

Бин содержит конструктор по умолчанию или файл, содержащий сериализованный экземпляр. Следовательно, бин может создавать другой бин.

Свойства bean-компонента могут быть разделены на булевы или не-булевы свойства.

Не булево свойство содержит методы получения и установки.

Логическое свойство содержит сеттер и является методом.

Метод получения любого свойства должен начинаться с маленькой буквы get (соглашение о методе java) и продолжаться именем поля, которое начинается с заглавной буквы. Например, именем поля является salary, поэтому метод получения этого поля — getSalary () .

Метод установки любого свойства должен начинаться с небольшого набора букв (соглашение о методе java), продолжаясь именем поля, которое начинается с заглавной буквы, и значением аргумента, которое нужно установить в поле. Например, именем поля является salary, поэтому метод установки этого поля — setSalary (double sal) .

Для логического свойства — это метод для проверки, является ли оно истинным или ложным. Например, логическое свойство пустое , метод is этого поля isEmpty () .

JPA — Установка

В этой главе описан процесс настройки JPA в системах на базе Windows и Linux. JPA можно легко установить и интегрировать в текущую среду Java, выполнив несколько простых шагов без каких-либо сложных процедур настройки. Администрация пользователя требуется при установке.

Системные Требования

JDK Java SE 2 JDK 1.5 или выше
объем памяти 1 ГБ ОЗУ (рекомендуется)
Дисковое пространство Нет минимальных требований
Версия операционной системы Windows XP или выше, Linux

Давайте теперь перейдем к шагам по установке JPA.

Шаг 1: Проверьте вашу установку Java

Прежде всего, вам необходимо установить Java Software Development Kit (SDK) в вашей системе. Чтобы убедиться в этом, выполните любую из следующих двух команд в зависимости от платформы, на которой вы работаете.

Если установка Java была выполнена правильно, то на ней отобразится текущая версия и спецификация вашей установки Java. Пример вывода приведен в следующей таблице.

Платформа команда Пример вывода
Windows

Откройте командную консоль и введите:

\> Java-версия

Java версия «1.7.0_60»

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

Linux

Откройте командный терминал и введите:

$ java – версия

Java-версия «1.7.0_25»

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

Откройте командную консоль и введите:

\> Java-версия

Java версия «1.7.0_60»

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

Откройте командный терминал и введите:

$ java – версия

Java-версия «1.7.0_25»

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

  • Мы предполагаем, что читатели этого руководства установили Java SDK версии 1.7.0_60 в своей системе.

  • Если у вас нет Java SDK, загрузите его текущую версию с http://www.oracle.com/technetwork/java/javase/downloads/index.html и установите его.

Мы предполагаем, что читатели этого руководства установили Java SDK версии 1.7.0_60 в своей системе.

Если у вас нет Java SDK, загрузите его текущую версию с http://www.oracle.com/technetwork/java/javase/downloads/index.html и установите его.

Шаг 2. Установите среду Java

Установите переменную среды JAVA_HOME, чтобы она указывала на местоположение базовой директории, где установлена ​​Java на вашем компьютере. Например,

Платформа Описание
Windows Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60
Linux Экспорт JAVA_HOME = / usr / local / java-current

Добавьте полный путь расположения компилятора Java к системному пути.

Платформа Описание
Windows Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной PATH.
Linux Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Выполните команду java -version из командной строки, как описано выше.

Шаг 3: Установка JPA

Вы можете пройти установку JPA с помощью любого из JPA-провайдеров из этого руководства, например, Eclipselink, Hibernate. Давайте проследим за установкой JPA, используя Eclipselink. Для программирования JPA мы должны следовать определенной структуре папок, поэтому лучше использовать IDE.

Загрузите форму Eclipse IDE по ссылке https://www.eclipse.org/downloads/ Выберите разработчика EclipseIDE for JavaEE, который является Eclipse indigo .

Разархивируйте ZIP-файл Eclipse на диске C. Откройте Eclipse IDE.

Установка JPA

Установка JPA с использованием Eclipselink

Eclipselink — это библиотека, поэтому мы не можем добавить ее напрямую в Eclipse IDE. Для установки JPA с помощью Eclipselink вам необходимо выполнить шаги, указанные ниже.

  • Создайте новый проект JPA, выбрав File-> New-> JPA Project в Eclipse IDE следующим образом:

    Новый JPA

  • Вы получите диалоговое окно с именем New JPA Project . Введите название проекта tutorialspoint_JPA_Eclipselink , проверьте версию jre и нажмите «Далее»:

    Диалоговое окно

  • Нажмите на библиотеку загрузки (если у вас нет библиотеки) в разделе пользовательской библиотеки.

    Скачать библиотеку

  • Выберите последнюю версию библиотеки Eclipselink в диалоговом окне «Загрузка библиотеки» и нажмите «Далее» следующим образом:

    Диалоговое окно "Загрузить библиотеку"

  • Примите условия лицензии и нажмите Готово для загрузки библиотеки.

    Лицензия

  • 6. Загрузка начинается, как показано на следующем снимке экрана.

    Процесс

  • После загрузки выберите загруженную библиотеку в разделе пользовательских библиотек и нажмите «Готово».

    Библиотечный раздел

  • Наконец, вы получаете файл проекта в Package Explorer в Eclipse IDE. Распакуйте все файлы, вы получите папку и файловую иерархию следующим образом:

    Проводник пакетов

Создайте новый проект JPA, выбрав File-> New-> JPA Project в Eclipse IDE следующим образом:

Вы получите диалоговое окно с именем New JPA Project . Введите название проекта tutorialspoint_JPA_Eclipselink , проверьте версию jre и нажмите «Далее»:

Нажмите на библиотеку загрузки (если у вас нет библиотеки) в разделе пользовательской библиотеки.

Выберите последнюю версию библиотеки Eclipselink в диалоговом окне «Загрузка библиотеки» и нажмите «Далее» следующим образом:

Примите условия лицензии и нажмите Готово для загрузки библиотеки.

6. Загрузка начинается, как показано на следующем снимке экрана.

После загрузки выберите загруженную библиотеку в разделе пользовательских библиотек и нажмите «Готово».

Наконец, вы получаете файл проекта в Package Explorer в Eclipse IDE. Распакуйте все файлы, вы получите папку и файловую иерархию следующим образом:

Добавление MySQL-коннектора в Project

Любой пример, который мы здесь обсуждаем, требует подключения к базе данных. Давайте рассмотрим базу данных MySQL для операций с базой данных. Для взаимодействия с Java-программой требуется jar-файл mysql-connector.

Следуйте инструкциям для настройки JAR базы данных в вашем проекте.

  • Перейдите в Свойства проекта -> Путь сборки Java, щелкнув по нему правой кнопкой мыши. Вы получите диалоговое окно, как показано на следующем снимке экрана. Нажмите на Добавить внешние банки.

    Внешние банки

  • Перейдите в папку с банкой в ​​системной памяти, выберите файл и нажмите «Открыть».

    Расположение банки

  • Нажмите ОК в диалоговом окне свойств. Вы получите MySQL-коннектор Jar в свой проект. Теперь вы можете выполнять операции с базой данных, используя MySQL.

Перейдите в Свойства проекта -> Путь сборки Java, щелкнув по нему правой кнопкой мыши. Вы получите диалоговое окно, как показано на следующем снимке экрана. Нажмите на Добавить внешние банки.

Перейдите в папку с банкой в ​​системной памяти, выберите файл и нажмите «Открыть».

Нажмите ОК в диалоговом окне свойств. Вы получите MySQL-коннектор Jar в свой проект. Теперь вы можете выполнять операции с базой данных, используя MySQL.

JPA — Entity Managers

Эта глава использует простой пример, чтобы продемонстрировать, как работает JPA. Давайте рассмотрим управление сотрудниками в качестве примера. Предположим, что Управление сотрудника создает, обновляет, находит и удаляет записи сотрудника. Как уже упоминалось, мы используем базу данных MySQL для операций базы данных.

Основные модули для этого примера:

  • Модель или POJO

    Employee.java

  • Упорство

    persistence.xml

  • обслуживание

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

Модель или POJO

Employee.java

Упорство

persistence.xml

обслуживание

CreatingEmployee.java

UpdatingEmployee.java

FindingEmployee.java

DeletingEmployee.java

Давайте возьмем иерархию пакетов, которую мы использовали в установке JPA с Eclipselink. Следуйте иерархии для этого примера, как показано ниже:

Иерархия пакетов

Создание сущностей

Сущности — это не что иное, как бобы или модели. В этом примере мы будем использовать Employee в качестве объекта. eid , ename , salary и deg — это атрибуты этой сущности. Он содержит конструктор по умолчанию, а также методы установки и получения этих атрибутов.

В показанной выше иерархии создайте пакет с именем ‘com.tutorialspoint.eclipselink.entity’ в пакете ‘src’ (Source). Создайте класс с именем Employee.java для данного пакета следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
    public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

В приведенном выше коде мы использовали аннотацию @Entity, чтобы сделать этот класс POJO сущностью.

Прежде чем перейти к следующему модулю, нам нужно создать базу данных для реляционной сущности, которая будет регистрировать базу данных в файле persistence.xml . Откройте MySQL Workbench и введите hte следующий запрос.

create database jpadb
use jpadb

persistence.xml

Этот модуль играет решающую роль в концепции JPA. В этом XML-файле мы зарегистрируем базу данных и укажем класс сущности.

В показанной выше иерархии пакетов файл persistence.xml в пакете JPA Content выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
                         	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<properties>
	   <property name="javax.persistence.jdbc.url"
                   value="jdbc:mysql://localhost:3306/jpadb"/>
     	   <property name="javax.persistence.jdbc.user" value="root"/>
	       <property name="javax.persistence.jdbc.password" value="root"/>
	       <property name="javax.persistence.jdbc.driver"
                   value="com.mysql.jdbc.Driver"/>
           <property name="eclipselink.logging.level" value="FINE"/>
	       <property name="eclipselink.ddl-generation" 
		           value="create-tables"/>
	</properties>
	</persistence-unit>
</persistence>

В приведенном выше XML-коде тег <persistence-unit> определен с определенным именем для персистентности JPA. Тег <class> определяет класс сущности с именем пакета. Тег <properties> определяет все свойства, а тег <property> определяет каждое свойство, такое как регистрация базы данных, спецификация URL, имя пользователя и пароль. Это свойства Eclipselink. Этот файл настроит базу данных.

Постоянство Операции

Постоянные операции используются для взаимодействия с базой данных и являются операциями загрузки и хранения . В бизнес-компоненте все постоянные операции подпадают под классы обслуживания.

В показанной выше иерархии пакетов создайте пакет с именем ‘com.tutorialspoint.eclipselink.service’ в пакете ‘src’ (source). Все сервисные классы с именами CreateEmloyee.java, UpdateEmployee.java, FindEmployee.java и DeleteEmployee.java. подпадает под данный пакет следующим образом:

Создать сотрудника

В следующем фрагменте кода показано, как создать класс Employee с именем CreateEmployee.java .

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class CreateEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		Employee employee = new Employee( ); 
		employee.setEid( 1201 );
		employee.setEname( "Gopal" );
		employee.setSalary( 40000 );
		employee.setDeg( "Technical Manager" );
		entitymanager.persist( employee );
		entitymanager.getTransaction( ).commit( );
		
		entitymanager.close( );
		emfactory.close( );
	}
}

В приведенном выше коде createEntityManagerFactory () создает модуль постоянства, предоставляя то же уникальное имя, которое мы предоставляем для модуля постоянства в файле persistent.xml. Объект entitymanagerfactory создаст экземпляр entitymanger с помощью метода createEntityManager () . Объект entitymanager создает экземпляр entitytransaction для управления транзакциями. Используя объект entitymanager , мы можем сохранить объекты в базе данных.

После компиляции и выполнения вышеуказанной программы вы получите уведомления из библиотеки eclipselink на панели консоли IDE eclipse.

Для результата откройте рабочую среду MySQL и введите следующие запросы.

use jpadb
select * from employee

Созданная таблица базы данных с именем employee будет отображена в табличном формате следующим образом:

Ид Ename Оплата труда градус
1201 Гопал 40000 Технический менеджер

Обновить сотрудника

Чтобы обновить записи сотрудника, нам нужно извлечь существующие записи из базы данных, внести изменения и, наконец, зафиксировать их в базе данных. Класс с именем UpdateEmployee.java показан следующим образом:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class UpdateEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
				entitymanager.getTransaction( ).begin( );
		Employee employee=entitymanager.
				find( Employee.class, 1201 );
		//before update
		System.out.println( employee );
		employee.setSalary( 46000 );
		entitymanager.getTransaction( ).commit( );
        //after update
		System.out.println( employee );
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и выполнения вышеуказанной программы вы получите уведомления из библиотеки Eclipselink на панели консоли IDE eclipse.

Для результата откройте рабочую среду MySQL и введите следующие запросы.

use jpadb
select * from employee

Созданная таблица базы данных с именем employee будет отображена в табличном формате следующим образом:

Ид Ename Оплата труда градус
1201 Гопал 46000 Технический менеджер

Заработная плата работника, 1201 обновлена ​​до 46000.

Найти сотрудника

Чтобы найти записи сотрудника, нам нужно будет извлечь существующие данные из базы данных и отобразить их. В этой операции EntityTransaction не применяется при извлечении записи.

Класс с именем FindEmployee.java выглядит следующим образом.

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class FindEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence
				.createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager();
		Employee employee = entitymanager.
				find( Employee.class, 1201 );
		
		System.out.println("employee ID = "+employee.getEid( ));
		System.out.println("employee NAME = "+employee.getEname( ));
		System.out.println("employee SALARY = "+employee.getSalary( ));
		System.out.println("employee DESIGNATION = "+employee.getDeg( ));
	}
}

После компиляции и выполнения вышеуказанной программы вы получите следующий вывод из библиотеки Eclipselink на панели консоли IDE eclipse.

employee ID = 1201
employee NAME = Gopal
employee SALARY = 46000.0
employee DESIGNATION = Technical Manager

Удаление сотрудника

Чтобы удалить записи сотрудника, сначала мы найдем существующие записи, а затем удалим их. Здесь EntityTransaction играет важную роль.

Класс с именем DeleteEmployee.java выглядит следующим образом:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class DeleteEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		Employee employee=entitymanager.
				find( Employee.class, 1201 );
		entitymanager.remove( employee );
		entitymanager.getTransaction( ).commit( );
		entitymanager.close( );
		emfactory.close( );
	}
}

После компиляции и выполнения вышеуказанной программы вы получите уведомления из библиотеки Eclipselink на панели консоли IDE eclipse.

Для результата откройте рабочую среду MySQL и введите следующие запросы.

use jpadb
select * from employee

Созданная база данных с именем employee будет иметь нулевые записи.

После завершения всех модулей в этом примере иерархия пакетов и файлов выглядит следующим образом:

Модули

JPA — JPQL

В этой главе описывается JPQL и как он работает с постоянными модулями. В этой главе приведенные примеры следуют той же иерархии пакетов, которую мы использовали в предыдущей главе.

JPA JPQL

Язык запросов персистентности Java

JPQL расшифровывается как Java Persistence Query Language. Он используется для создания запросов к сущностям для хранения в реляционной базе данных. JPQL разработан на основе синтаксиса SQL. Но это не повлияет на базу данных напрямую.

JPQL может извлекать данные, используя предложение SELECT, может выполнять массовые обновления, используя предложение UPDATE и предложение DELETE.

Структура запроса

Синтаксис JPQL очень похож на синтаксис SQL. Наличие SQL-подобного синтаксиса является преимуществом, потому что SQL прост и широко используется. SQL работает непосредственно против таблиц, записей и полей реляционной базы данных, тогда как JPQL работает с классами и экземплярами Java.

Например, запрос JPQL может извлечь объект базы данных, а не набор результатов поля из базы данных, как в случае с SQL. Структура запроса JPQL выглядит следующим образом.

SELECT ... FROM ...
[WHERE ...]
[GROUP BY ... [HAVING ...]]
[ORDER BY ...]

Структура запросов JPQL DELETE и UPDATE следующая.

DELETE FROM ... [WHERE ...]
 
UPDATE ... SET ... [WHERE ...]

Скалярные и агрегатные функции

Скалярные функции возвращают результирующие значения на основе входных значений. Агрегатные функции возвращают результирующие значения путем вычисления входных значений.

Мы будем использовать тот же пример управления сотрудниками, что и в предыдущей главе. Здесь мы пройдемся по классам обслуживания, используя скалярные и агрегатные функции JPQL.

Предположим, что таблица jpadb.employee содержит следующие записи.

Ид Ename Оплата труда градус
1201 Гопал 40000 Технический менеджер
1202 Маниша 40000 Proof Reader
1203 Masthanvali 40000 Технический писатель
1204 Сатиш 30000 Технический писатель
1205 Кришна 30000 Технический писатель
1206 Киран 35000 Proof Reader

Создайте класс с именем ScalarandAggregateFunctions.java в пакете com.tutorialspoint.eclipselink.service следующим образом.

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class ScalarandAggregateFunctions 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager();
		//Scalar function
		Query query = entitymanager.
		createQuery("Select UPPER(e.ename) from Employee e");
		List<String> list=query.getResultList();
		
		for(String e:list)
		{
			System.out.println("Employee NAME :"+e);
		}
		//Aggregate function
		Query query1 = entitymanager.
				createQuery("Select MAX(e.salary) from Employee e");
		Double result=(Double) query1.getSingleResult();
		System.out.println("Max Employee Salary :"+result);
	}
}

После компиляции и выполнения вышеуказанной программы вы получите следующий вывод на консольную панель Eclipse IDE.

Employee NAME :GOPAL
Employee NAME :MANISHA
Employee NAME :MASTHANVALI
Employee NAME :SATISH
Employee NAME :KRISHNA
Employee NAME :KIRAN
ax Employee Salary :40000.0

Между, И, Как Ключевые слова

Между , А и Лайк являются основными ключевыми словами JPQL. Эти ключевые слова используются после предложения Where в запросе.

Создайте класс с именем BetweenAndLikeFunctions.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class BetweenAndLikeFunctions 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		//Between
		Query query = entitymanager.
			createQuery( "Select e " +
					     "from Employee e " +
					     "where e.salary " +
					     "Between 30000 and 40000" )
		List<Employee> list=(List<Employee>)query.getResultList( );
		 
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee salary :"+e.getSalary( ));
		}
		
		//Like
		Query query1 = entitymanager.
			createQuery("Select e " +
					    "from Employee e " +
					    "where e.ename LIKE 'M%'");
		List<Employee> list1=(List<Employee>)query1.getResultList( );
		for( Employee e:list1 )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee name :"+e.getEname( ));
		}
	}
}

После компиляции и выполнения вышеуказанной программы вы получите следующий вывод на панели консоли Eclipse IDE.

Employee ID :1201	 Employee salary :40000.0
Employee ID :1202	 Employee salary :40000.0
Employee ID :1203	 Employee salary :40000.0
Employee ID :1204	 Employee salary :30000.0
Employee ID :1205	 Employee salary :30000.0
Employee ID :1206	 Employee salary :35000.0

Employee ID :1202	 Employee name :Manisha
Employee ID :1203	 Employee name :Masthanvali

заказ

Чтобы упорядочить записи в JPQL, мы используем предложение ORDER BY. Использование этого предложения такое же, как в SQL, но оно касается сущностей. В следующем примере показано, как использовать предложение ORDER BY.

Создайте класс Ordering.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class Ordering 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		//Between
		Query query = entitymanager.
			createQuery( "Select e " +
					     "from Employee e " +
					     "ORDER BY e.ename ASC" );
		List<Employee> list=(List<Employee>)query.getResultList( );
		 
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee Name :"+e.getEname( ));
		}
	}
}

Скомпилировав и выполнив вышеуказанную программу, вы получите следующий вывод на панели консоли Eclipse IDE.

Employee ID :1201	 Employee Name :Gopal
Employee ID :1206	 Employee Name :Kiran
Employee ID :1205	 Employee Name :Krishna
Employee ID :1202	 Employee Name :Manisha
Employee ID :1203	 Employee Name :Masthanvali
Employee ID :1204	 Employee Name :Satish

Именованные Запросы

Аннотация @NamedQuery определяется как запрос с предопределенной строкой запроса, которую нельзя изменить. В отличие от динамических запросов, именованные запросы могут улучшить организацию кода, отделяя строки запросов JPQL от POJO. Он также передает параметры запроса вместо динамического встраивания литералов в строку запроса и, следовательно, создает более эффективные запросы.

Прежде всего, добавьте аннотацию @NamedQuery к классу сущностей Employee с именем Employee.java в пакете com.tutorialspoint.eclipselink.entity следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table
@NamedQuery(query = "Select e from Employee e where e.eid = :id", 
		name = "find employee by id")
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

Создайте класс с именем NamedQueries.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class NamedQueries 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		Query query = entitymanager.createNamedQuery(
			"find employee by id");
		query.setParameter("id", 1204);
		List<Employee> list = query.getResultList( );
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee Name :"+e.getEname( ));
		}
	}
}

После компиляции и выполнения вышеуказанной программы вы получите следующий вывод на панели консоли Eclipse IDE.

Employee ID :1204	 Employee Name :Satish

После добавления всех вышеперечисленных классов иерархия пакетов выглядит следующим образом:

Иерархия пакетов

Стремительный и ленивый выбор

Наиболее важной концепцией JPA является создание дубликата базы данных в кеш-памяти. При выполнении транзакций с базой данных JPA сначала создает дублированный набор данных, и только когда они фиксируются с помощью диспетчера сущностей, изменения вносятся в базу данных.

Есть два способа получения записей из базы данных.

Нетерпеливый выбор

При активном извлечении связанные дочерние объекты загружаются автоматически при извлечении определенной записи.

Ленивый выбор

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

Ленивая выборка возможна, когда вы пытаетесь получить записи в первый раз. Таким образом, копия всей записи уже хранится в кэш-памяти. С точки зрения производительности, ленивая выборка предпочтительнее.

JPA — Расширенные сопоставления

JPA — это библиотека, выпущенная со спецификациями Java. Следовательно, он поддерживает все объектно-ориентированные концепции для сохранения сущности. До сих пор мы закончили с основами реляционного отображения объектов. В этой главе рассказывается о сложных сопоставлениях между объектами и реляционными сущностями.

Стратегии наследования

Наследование является основной концепцией любого объектно-ориентированного языка, поэтому мы можем использовать отношения наследования или стратегии между сущностями. JPA поддерживает три типа стратегий наследования: SINGLE_TABLE, JOINED_TABLE и TABLE_PER_CONCRETE_CLASS.

Давайте рассмотрим пример. Следующая диаграмма показывает три класса, а именно. Сотрудники, TeachingStaff и NonTeachingStaff, а также их отношения.

Стратегия наследования

На приведенной выше диаграмме Staff является сущностью, а TeachingStaff и NonTeachingStaff являются дочерними сущностями Staff. Здесь мы будем использовать приведенный выше пример, чтобы продемонстрировать все три три стратегии наследования.

Стратегия единого стола

Стратегия с одним столом берет все поля классов (как супер, так и подклассы) и отображает их в единую таблицу, известную как стратегия SINGLE_TABLE. Здесь значение дискриминатора играет ключевую роль в дифференцировании значений трех объектов в одной таблице.

Давайте рассмотрим приведенный выше пример. TeachingStaff и NonTeachingStaff являются подклассами персонала. Согласно концепции наследования, подкласс наследует свойства своего суперкласса. Поэтому sid и sname являются полями, которые принадлежат как TeachingStaff, так и NonTeachingStaff. Создать проект JPA. Все модули этого проекта следующие:

Создание сущностей

Создайте пакет с именем ‘com.tutorialspoint.eclipselink.entity’ в пакете ‘src’ . Создайте новый Java-класс с именем Staff.java в указанном пакете. Класс сущности персонала отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name="type" )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

В приведенном выше коде @DescriminatorColumn указывает имя поля (тип), а его значения показывают оставшиеся поля (Teaching и NonTeachingStaff).

Создайте подкласс (класс) для класса Staff с именем TeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности TeachingStaff отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value="TS" )
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
	}

	public String getQualification( )
	{
		return qualification;
	}

	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Создайте подкласс (класс) для класса Staff с именем NonTeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс Entity NonTeachingStaff показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value = "NS" )
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise ) 
	{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

persistence.xml

Persistence.xml содержит информацию о конфигурации базы данных и информацию о регистрации классов сущностей. XML-файл отображается следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	    <class>com.tutorialspoint.eclipselink.entity.Staff</class>
		<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
		<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисный класс

Классы обслуживания являются частью реализации бизнес-компонента. Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ .

Создайте класс с именем SaveClient.java в указанном пакете для хранения полей класса Staff, TeachingStaff и NonTeachingStaff. Класс SaveClient отображается следующим образом:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;

public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
				4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и запуска вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Проверьте MySQL верстак для вывода. Вывод в табличном формате показан следующим образом:

Sid Тип $ name Areaexpertise Квалификация Subjectexpertise
1 TS Гопал MSC MED математика
2 TS Маниша BSC BED английский
3 NS Сатиш Счета
4 NS Кришна Администратор офиса

Наконец, вы получите одну таблицу, содержащую поле всех трех классов со столбцом дискриминатора с именем Type (field).

Стратегия объединенного стола

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

Создать проект JPA. Все модули проекта показаны ниже.

Создание сущностей

Создайте пакет с именем ‘com.tutorialspoint.eclipselink.entity’ в пакете ‘src’ . Создайте новый Java-класс с именем Staff.java в указанном пакете. Класс сущности персонала отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.JOINED )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

Создайте подкласс (класс) для класса Staff с именем TeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности TeachingStaff отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="sid")
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
		
	}

	public String getQualification( )
	{
		return qualification;
	}

	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Создайте подкласс (класс) для класса Staff с именем NonTeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс Entity NonTeachingStaff показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="sid")
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise ) 
	{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

persistence.xml

Файл Persistence.xml содержит информацию о конфигурации базы данных и информацию о регистрации классов сущностей. XML-файл отображается следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Staff</class>
	<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
	<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисный класс

Классы обслуживания являются частью реализации бизнес-компонента. Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ .

Создайте класс с именем SaveClient.java в указанном пакете для хранения полей класса Staff, TeachingStaff и NonTeachingStaff. Тогда класс SaveClient показывается следующим образом:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;

public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
		4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и запуска вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Для вывода проверьте MySQL Workbench.

Здесь создаются три таблицы, и результат таблицы персонала отображается в табличном формате.

Sid DTYPE $ name
1 Преподавательский состав Гопал
2 Преподавательский состав Маниша
3 NonTeachingStaff Сатиш
4 NonTeachingStaff Кришна

Результат таблицы TeachingStaff отображается следующим образом:

Sid Квалификация Subjectexpertise
1 MSC MED математика
2 BSC BED английский

В приведенной выше таблице sid — это внешний ключ (таблица персонала формы справочного поля). Результат таблицы NonTeachingStaff отображается следующим образом:

Sid Areaexpertise
3 Счета
4 Администратор офиса

Наконец, три таблицы создаются с использованием соответствующих полей, а поле SID используется всеми тремя таблицами. В таблице Staff SID является первичным ключом. В двух оставшихся таблицах (TeachingStaff и NonTeachingStaff) SID является внешним ключом.

Таблица для стратегии класса

Стратегия для каждого класса заключается в создании таблицы для каждого подобъекта. Таблица Staff будет создана, но она будет содержать нулевые значения. Значения полей таблицы Staff должны совместно использоваться таблицами TeachingStaff и NonTeachingStaff.

Давайте рассмотрим тот же пример, что и выше.

Создание сущностей

Создайте пакет с именем ‘com.tutorialspoint.eclipselink.entity’ в пакете ‘src’ . Создайте новый Java-класс с именем Staff.java в указанном пакете. Класс сущности персонала отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

Создайте подкласс (класс) для класса Staff с именем TeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности TeachingStaff отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
		
	}

	public String getQualification( )
	{
		return qualification;
	}
	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Создайте подкласс (класс) для класса Staff с именем NonTeachingStaff.java в пакете com.tutorialspoint.eclipselink.entity . Класс Entity NonTeachingStaff показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise )
			{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

persistence.xml

Файл Persistence.xml содержит информацию о конфигурации базы данных и информацию о регистрации классов сущностей. XML-файл отображается следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Staff</class>
	<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
	<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
			</properties>
	</persistence-unit>
</persistence>

Сервисный класс

Классы обслуживания являются частью реализации бизнес-компонента. Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ .

Создайте класс с именем SaveClient.java в указанном пакете для хранения полей класса Staff, TeachingStaff и NonTeachingStaff. Класс SaveClient отображается следующим образом:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;
public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
				4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и запуска вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Для вывода проверьте MySQL Workbench.

Здесь создаются три таблицы, а таблица Staff содержит нулевые записи.

Результат TeachingStaff отображается следующим образом:

Sid Квалификация $ name Subjectexpertise
1 MSC MED Гопал математика
2 BSC BED Маниша английский

Приведенная выше таблица TeachingStaff содержит поля сущностей Staff и TeachingStaff.

Результат NonTeachingStaff отображается следующим образом:

Sid Areaexpertise $ name
3 Счета Сатиш
4 Администратор офиса Кришна

Приведенная выше таблица NonTeachingStaff содержит поля сущностей Staff и NonTeachingStaff.

JPA — отношения сущностей

Эта глава проведет вас через отношения между сущностями. Как правило, отношения между таблицами в базе данных более эффективны. Здесь классы сущностей рассматриваются как реляционные таблицы (концепция JPA), поэтому отношения между классами сущностей таковы:

  • @ManyToOne Relation
  • @OneToMany Relation
  • @OneToOne Relation
  • @ManyToMany Relation

@ManyToOne Relation

Отношение «многие к одному» между сущностями существует, когда на одну сущность (столбец или набор столбцов) ссылается другая сущность (столбец или набор столбцов), содержащая уникальные значения. В реляционных базах данных эти отношения применяются с использованием внешнего ключа / первичного ключа между таблицами.

Давайте рассмотрим пример отношения между сотрудниками и подразделениями. Однонаправленным образом, то есть от сотрудника к отделу, применимо отношение «многие к одному». Это означает, что каждая запись сотрудника содержит один идентификатор отдела, который должен быть первичным ключом в таблице отдела. Здесь в таблице Employee идентификатор отдела — это внешний ключ.

На следующей диаграмме показано отношение «многие к одному» между двумя таблицами.

@ManyToOne Relation

Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_MTO . Все модули этого проекта обсуждаются ниже.

Создание сущностей

Следуйте приведенной выше схеме для создания сущностей. Создайте пакет с именем ‘com.tutorialspoin.eclipselink.entity’ в пакете ‘src’ . Создайте класс с именем Department.java для данного пакета. Класс Отдел сущности показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;

    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }
}

Создайте в этом отношении второй объект — класс объектов Employee с именем Employee.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности Employee отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	@ManyToOne
	private Department department;
	
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
		
	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}
}

persistence.xml

Файл Persistence.xml необходим для настройки базы данных и регистрации классов сущностей.

Persitence.xml будет создан IDE затмения при создании проекта JPA. Детали конфигурации являются пользовательскими спецификациями. Файл persistence.xml отображается следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password"
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисные классы

Этот модуль содержит классы обслуживания, которые реализуют реляционную часть с использованием атрибута инициализации. Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ . Класс DAO с именем ManyToOne.java создается под данным пакетом. Класс DAO показан следующим образом:

package com.tutorialspointeclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class ManyToOne 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Department Entity
		Department department = new Department();
		department.setName("Development");
		//Store Department
		entitymanager.persist(department);
		
		//Create Employee1 Entity
		Employee employee1 = new Employee();
		employee1.setEname("Satish");
		employee1.setSalary(45000.0);
		employee1.setDeg("Technical Writer");
		employee1.setDepartment(department);

		//Create Employee2 Entity
		Employee employee2 = new Employee();
		employee2.setEname("Krishna");
		employee2.setSalary(45000.0);
		employee2.setDeg("Technical Writer");
		employee2.setDepartment(department);

		//Create Employee3 Entity
		Employee employee3 = new Employee();
		employee3.setEname("Masthanvali");
		employee3.setSalary(50000.0);
		employee3.setDeg("Technical Writer");
		employee3.setDepartment(department);
		
		//Store Employees
		entitymanager.persist(employee1);
		entitymanager.persist(employee2);
		entitymanager.persist(employee3);
				
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и запуска вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Для вывода проверьте MySQL Workbench. В этом примере созданы две таблицы.

Передайте следующий запрос в интерфейсе MySQL, и результат таблицы Department будет отображаться следующим образом:

Select * from department
Я БЫ название
101 развитие

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

Select * from employee
Ид градус Ename Оплата труда department_id
102 Технический писатель Сатиш 45000 101
103 Технический писатель Кришна 45000 101
104 Технический писатель Masthanwali 50000 101

В приведенной выше таблице Deparment_Id — это внешний ключ (поле ссылки) из таблицы Department.

@OneToMany Relation

В этом отношении каждая строка одного объекта ссылается на множество дочерних записей в другом объекте. Важно то, что у дочерних записей не может быть нескольких родителей. В отношении «один ко многим» между таблицей A и таблицей B каждая строка в таблице A может быть связана с одной или несколькими строками в таблице B.

Давайте рассмотрим приведенный выше пример. Предположим, что таблицы Employee и Department в вышеприведенном примере связаны в обратном однонаправленном порядке, тогда отношение становится отношением «один ко многим». Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_OTM . Все модули этого проекта обсуждаются ниже.

Создание сущностей

Следуйте приведенной выше схеме для создания сущностей. Создайте пакет с именем ‘com.tutorialspoin.eclipselink.entity’ в пакете ‘src’ . Создайте класс с именем Department.java для данного пакета. Класс Отдел сущности показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;
    
    @OneToMany( targetEntity=Employee.class )
    private List employeelist;

    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }

    public List getEmployeelist() 
    {
	return employeelist;
    }

    public void setEmployeelist(List employeelist) 
    {
	this.employeelist = employeelist;
    }
}

Создайте в этом отношении вторую сущность — класс сущности Employee с именем Employee.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности Employee отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
		
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}	
}

persistence.xml

Файл persistence.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисные классы

Этот модуль содержит классы обслуживания, которые реализуют реляционную часть с использованием атрибута инициализации. Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ . Класс DAO с именем OneToMany.java создается под данным пакетом. Класс DAO показан следующим образом:

package com.tutorialspointeclipselink.service;

import java.util.List;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class OneToMany 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Employee1 Entity
		Employee employee1 = new Employee();
		employee1.setEname("Satish");
		employee1.setSalary(45000.0);
		employee1.setDeg("Technical Writer");
								
		//Create Employee2 Entity
		Employee employee2 = new Employee();
		employee2.setEname("Krishna");
		employee2.setSalary(45000.0);
		employee2.setDeg("Technical Writer");
								
		//Create Employee3 Entity
		Employee employee3 = new Employee();
		employee3.setEname("Masthanvali");
		employee3.setSalary(50000.0);
		employee3.setDeg("Technical Writer");
		
		//Store Employee
		entitymanager.persist(employee1);
		entitymanager.persist(employee2);
		entitymanager.persist(employee3);
		
		//Create Employeelist
		List<Employee> emplist = new ArrayList();
		emplist.add(employee1);
		emplist.add(employee2);
		emplist.add(employee3);
		
		//Create Department Entity
		Department department= new Department();
		department.setName("Development");
		department.setEmployeelist(emplist);
				
		//Store Department
		entitymanager.persist(department);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и выполнения вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Для вывода проверьте MySQL Workbench следующим образом.

В этом проекте созданы три таблицы. Передайте следующий запрос в интерфейсе MySQL, и результат таблицы Department_employee будет отображаться следующим образом:

Select * from department_Id;
department_id Employee_Eid
254 251
254 252
254 253

В приведенной выше таблице deparment_id и employee_id являются внешними ключами (справочными полями) из таблиц отделов и сотрудников.

Передайте следующий запрос в интерфейсе MySQL, и результат таблицы отделов будет отображен в табличном формате следующим образом.

Select * from department;
Я БЫ название
254 развитие

Передайте следующий запрос в интерфейс MySQL, и результат таблицы сотрудников будет отображаться следующим образом:

Select * from employee;
Ид градус Ename Оплата труда
251 Технический писатель Сатиш 45000
252 Технический писатель Кришна 45000
253 Технический писатель Masthanwali 50000

@OneToOne Relation

В отношениях «один-к-одному» один элемент может быть связан только с одним другим элементом. Это означает, что каждая строка одного объекта относится к одной и только одной строке другого объекта.

Давайте рассмотрим приведенный выше пример. Сотрудник и отдел в обратной однонаправленной манере, отношение один-к-одному. Это означает, что каждый сотрудник принадлежит только одному отделу. Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_OTO . Все модули этого проекта обсуждаются ниже.

Создание сущностей

Следуйте приведенной выше схеме для создания сущностей. Создайте пакет с именем ‘com.tutorialspoin.eclipselink.entity’ в пакете ‘src’ . Создайте класс с именем Department.java для данного пакета. Класс Отдел сущности показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;
   
    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }
}

Создайте в этом отношении вторую сущность — класс сущности Employee с именем Employee.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности Employee отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	
	@OneToOne
	private Department department;
		
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}

	public Department getDepartment() 
	{
		return department;
	}

	public void setDepartment(Department department) 
	{
		this.department = department;
	}	
}

persistence.xml

Файл Persistence.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисные классы

Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ . Класс DAO с именем OneToOne.java создается под данным пакетом. Класс DAO показан следующим образом:

package com.tutorialspointeclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class OneToOne 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Department Entity
		Department department = new Department();
		department.setName("Development");
		
		//Store Department
		entitymanager.persist(department);
		
		//Create Employee Entity
		Employee employee = new Employee();
		employee.setEname("Satish");
		employee.setSalary(45000.0);
		employee.setDeg("Technical Writer");
		employee.setDepartment(department);
		
		//Store Employee
		entitymanager.persist(employee);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

После компиляции и выполнения вышеуказанной программы вы получите уведомления на панели консоли Eclipse IDE. Для вывода проверьте MySQL Workbench следующим образом.

В приведенном выше примере созданы две таблицы. Передайте следующий запрос в интерфейс MySQL, и результат таблицы отделов будет отображаться следующим образом:

Select * from department
Я БЫ название
301 развитие

Передайте следующий запрос в интерфейс MySQL, и результат таблицы сотрудников будет отображаться следующим образом:

Select * from employee
Ид градус Ename Оплата труда department_id
302 Технический писатель Сатиш 45000 301

@ManyToMany Relation

Отношение «многие ко многим» — это когда одна или несколько строк одного объекта связаны с несколькими строками другого объекта.

Давайте рассмотрим пример отношения между двумя сущностями: классом и учителем . В двунаправленной манере и класс, и учитель имеют отношение «многие к одному». Это означает, что каждая запись класса указывается набором учителя (идентификаторы учителя), которые должны быть первичными ключами в таблице учителя и храниться в таблице Teacher_Class и наоборот. Здесь таблица Teachers_Class содержит оба поля внешнего ключа. Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_MTM . Все модули этого проекта обсуждаются ниже.

@ManyToOne Relation

Создание сущностей

Создайте объекты, следуя схеме, показанной на диаграмме выше. Создайте пакет с именем ‘com.tutorialspoin.eclipselink.entity’ в пакете ‘src’ . Создайте класс с именем Clas.java под данным пакетом. Класс Отдел сущности показан следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Clas 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int cid;
	private String cname;
	
	@ManyToMany(targetEntity=Teacher.class)
	private Set teacherSet;
	
	public Clas() 
	{
		super();
	}
	public Clas(int cid, 
			String cname, Set teacherSet) 
	{
		super();
		this.cid = cid;
		this.cname = cname;
		this.teacherSet = teacherSet;
	}
	public int getCid() 
	{
		return cid;
	}
	public void setCid(int cid) 
	{
		this.cid = cid;
	}
	public String getCname() 
	{
		return cname;
	}
	public void setCname(String cname) 
	{
		this.cname = cname;
	}
	public Set getTeacherSet() 
	{
		return teacherSet;
	}
	public void setTeacherSet(Set teacherSet) 
	{
		this.teacherSet = teacherSet;
	}	  
}

Создайте в этом отношении вторую сущность — класс сущности -работодателя с именем Teacher.java в пакете com.tutorialspoint.eclipselink.entity . Класс сущности Employee отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Teacher 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int tid;
	private String tname;
	private String subject;
	
	@ManyToMany(targetEntity=Clas.class)
	private Set clasSet;
	
	public Teacher() 
	{
		super();
	}
	public Teacher(int tid, String tname, String subject, 
			Set clasSet) 
	{
		super();
		this.tid = tid;
		this.tname = tname;
		this.subject = subject;
		this.clasSet = clasSet;
	}
	public int getTid() 
	{
		return tid;
	}
	public void setTid(int tid) 
	{
		this.tid = tid;
	}
	public String getTname() 
	{
		return tname;
	}
	public void setTname(String tname) 
	{
		this.tname = tname;
	}
	public String getSubject() 
	{
		return subject;
	}
	public void setSubject(String subject) 
	{
		this.subject = subject;
	}
	public Set getClasSet() 
	{
		return clasSet;
	}
	public void setClasSet(Set clasSet) 
	{
		this.clasSet = clasSet;
	}
}

persistence.xml

Файл Persistence.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Сервисные классы

Создайте пакет в пакете ‘src’ с именем ‘com.tutorialspoint.eclipselink.service’ . Класс DAO с именем ManyToMany.java создается под данным пакетом. Класс DAO показан следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Clas;
import com.tutorialspoint.eclipselink.entity.Teacher;

public class ManyToMany 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Clas Entity
		Clas clas1=new Clas(0,"1st",null);
		Clas clas2=new Clas(0,"2nd",null);
		Clas clas3=new Clas(0,"3rd",null);
		
		//Store Clas
		entitymanager.persist(clas1);
		entitymanager.persist(clas2);
		entitymanager.persist(clas3);
		
		//Create Clas Set1
		Set<Clas> classSet1 = new HashSet();
		classSet1.add(clas1);
		classSet1.add(clas2);
		classSet1.add(clas3);
		
		//Create Clas Set2
		Set<Clas> classSet2 = new HashSet();
		classSet2.add(clas3);
		classSet2.add(clas1);
		classSet2.add(clas2);
				
		//Create Clas Set3
		Set<Clas> classSet3 = new HashSet();
		classSet3.add(clas2);
		classSet3.add(clas3);
		classSet3.add(clas1);
		
		//Create Teacher Entity
		Teacher teacher1 = new Teacher(0,
				"Satish","Java",classSet1);
		Teacher teacher2 = new Teacher(0,
				"Krishna","Adv Java",classSet2);
		Teacher teacher3 = new Teacher(0,
				"Masthanvali","DB2",classSet3);
		
		//Store Teacher
		entitymanager.persist(teacher1);
		entitymanager.persist(teacher2);
		entitymanager.persist(teacher3);
		
		entitymanager.getTransaction( ).commit( );
		entitymanager.close( );
		emfactory.close( );
	}
}

В этом примере проекта созданы три таблицы. Передайте следующий запрос в интерфейсе MySQL, и результат таблицы teacher_clas будет отображаться следующим образом:

Select * form teacher_clas
Teacher_tid Classet_cid
354 351
355 351
356 351
354 352
355 352
356 352
354 353
355 353
356 353

В приведенной выше таблице teacher_tid является внешним ключом из таблицы учителя, а classet_cid является внешним ключом из таблицы классов. Поэтому разные учителя отводятся в разные классы.

Передайте следующий запрос в интерфейсе MySQL, и результат таблицы учителя будет отображен следующим образом:

Select * from teacher
Врем Предмет TName
354 Джава Сатиш
355 Adv Java Кришна
356 DB2 Masthanvali

Передайте следующий запрос в интерфейсе MySQL, и результат таблицы clas будет отображен следующим образом:

Select * from clas
Cid CNAME
351 первый
352 второй
353 третий

JPA — Критерий API

Критерии — это предопределенный API, который используется для определения запросов для сущностей. Это альтернативный способ определения JPQL-запроса. Эти запросы безопасны по типу, переносимы и легко изменяются путем изменения синтаксиса. Подобно JPQL, он следует абстрактной схеме (схема легко редактируется) и внедренным объектам. API метаданных смешивается с API критериев для моделирования постоянной сущности для запросов критериев.

Основным преимуществом Criteria API является то, что ошибки могут быть обнаружены ранее во время компиляции. Строковые запросы JPQL и запросы на основе критериев JPA одинаковы по производительности и эффективности.

История критериев API

Критерии включены во все версии JPA, поэтому каждый шаг критериев указывается в спецификациях JPA.

  • В JPA 2.0 разработан API запроса критериев стандартизации запросов.
  • В JPA 2.1 включены критерии обновления и удаления (массовое обновление и удаление).

Критерии Структура запроса

Критерии и JPQL тесно связаны, и им разрешено проектировать с использованием аналогичных операторов в своих запросах. Для разработки запроса следует пакет javax.persistence.criteria . Структура запроса означает синтаксический критерий запроса.

Следующий простой запрос критерия возвращает все экземпляры класса сущностей в источнике данных.

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class);
Root<Entity> from = cq.from(Entity.class);
cq.select(Entity);
TypedQuery<Entity> q = em.createQuery(cq);
List<Entity> allitems = q.getResultList();

Запрос демонстрирует основные этапы создания критерия.

  • Экземпляр EntityManager используется для создания объекта CriteriaBuilder.

  • Экземпляр CriteriaQuery используется для создания объекта запроса. Атрибуты этого объекта запроса будут изменены с подробностями запроса.

  • Метод CriteriaQuery.form вызывается для установки корня запроса.

  • CriteriaQuery.select вызывается для установки типа списка результатов.

  • Экземпляр TypedQuery <T> используется для подготовки запроса к выполнению и указания типа результата запроса.

  • Метод getResultList для объекта TypedQuery <T> для выполнения запроса. Этот запрос возвращает коллекцию сущностей, результат сохраняется в списке.

Экземпляр EntityManager используется для создания объекта CriteriaBuilder.

Экземпляр CriteriaQuery используется для создания объекта запроса. Атрибуты этого объекта запроса будут изменены с подробностями запроса.

Метод CriteriaQuery.form вызывается для установки корня запроса.

CriteriaQuery.select вызывается для установки типа списка результатов.

Экземпляр TypedQuery <T> используется для подготовки запроса к выполнению и указания типа результата запроса.

Метод getResultList для объекта TypedQuery <T> для выполнения запроса. Этот запрос возвращает коллекцию сущностей, результат сохраняется в списке.

Пример критериев API

Давайте рассмотрим пример базы данных сотрудников. Предположим, что таблица jpadb.employee содержит следующие записи:

Eid	 Ename          Salary	Deg
401	 Gopal	        40000	Technical Manager
402	 Manisha	    40000	Proof reader
403	 Masthanvali    35000	Technical Writer
404  Satish	        30000	Technical writer
405	 Krishna	    30000	Technical Writer
406	 Kiran	        35000	Proof reader

Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_Criteria . Все модули этого проекта обсуждаются ниже:

Создание сущностей

Создайте пакет с именем com.tutorialspoint.eclipselink.entity в разделе ‘src’

Создайте класс с именем Employee.java для данного пакета. Класс «Сотрудник» отображается следующим образом:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

persistence.xml

Файл Persistence.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
			          value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Классы обслуживания

Этот модуль содержит классы обслуживания, которые реализуют часть запроса Criteria с помощью инициализации MetaData API. Создайте пакет с именем «com.tutorialspoint.eclipselink.service» . Класс с именем CriteriaAPI.java создается под данным пакетом. Класс DAO показан следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.tutorialspoint.eclipselink.entity.Employee;

public class CriteriaApi 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		CriteriaBuilder criteriaBuilder = entitymanager
				.getCriteriaBuilder();
		CriteriaQuery<Object> criteriaQuery = criteriaBuilder
				.createQuery();
		Root<Employee> from = criteriaQuery.from(Employee.class);
		
		//select all records
        System.out.println(“Select all records”);
		CriteriaQuery<Object> select =criteriaQuery.select(from);
		TypedQuery<Object> typedQuery = entitymanager
				.createQuery(select);
		List<Object> resultlist= typedQuery.getResultList();
		
		for(Object o:resultlist)
		{
			Employee e=(Employee)o;
			System.out.println("EID : "+e.getEid()
					+" Ename : "+e.getEname());
		}
		
		//Ordering the records 
        System.out.println(“Select all records by follow ordering”);
		CriteriaQuery<Object> select1 = criteriaQuery.select(from);
        select1.orderBy(criteriaBuilder.asc(from.get("ename")));
        TypedQuery<Object> typedQuery1 = entitymanager
        		.createQuery(select);
        List<Object> resultlist1= typedQuery1.getResultList();
		
		for(Object o:resultlist1)
		{
			Employee e=(Employee)o;
			System.out.println("EID : "+e.getEid()
					+" Ename : "+e.getEname());
		}
		
		entitymanager.close( );
		emfactory.close( );
	}
}

После компиляции и выполнения вышеуказанной программы вы получите следующий вывод на панели консоли Eclipse IDE.