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

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

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

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

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

  • Granularity : Объектная модель имеет большую степень детализации, чем реляционная модель.

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

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

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

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

Что такое JPA?

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

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

Чтобы уменьшить нагрузку на написание кодов для управления реляционными объектами, программист следует структуре «JPA Provider», которая позволяет легко взаимодействовать с экземпляром базы данных. Здесь необходимая структура берется на себя 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 Community Process JSR 317.

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

Провайдеры JPA

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

Hibernate, Eclipselink, Toplink, Spring Data JPA, etc.

Java Persistence API - это источник для хранения бизнес-сущностей как реляционных сущностей. В нем показано, как определить ОБЫЧНЫЙ СТАРЫЙ ОБЪЕКТ JAVA (POJO) как сущность и как управлять сущностями с отношениями.

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

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

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

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

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

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

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

  • Связь между EntityManagerFactory и EntityManager является one-to-many. Это фабричный класс для экземпляров EntityManager.

  • Связь между EntityManager и EntityTransaction: one-to-one. Для каждой операции EntityManager существует экземпляр EntityTransaction.

  • Связь между EntityManager и Query one-to-many. С помощью одного экземпляра EntityManager можно выполнить большое количество запросов.

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

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

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

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

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

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

  • Idiomatic persistence : Это позволяет вам писать классы сохраняемости, используя объектно-ориентированные классы.

  • High Performance : В нем много методов извлечения и надежных методов блокировки.

  • Reliable : Он очень стабилен и используется многими профессиональными программистами.

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

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

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

Фаза 1

Первый этап, названный object data phase, содержит классы POJO, интерфейсы служб и классы. Это основной уровень бизнес-компонентов, который имеет операции и атрибуты бизнес-логики.

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

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

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

Фаза 2

Вторая фаза, названная mapping или же persistence phase, содержит поставщика JPA, файл сопоставления (ORM.xml), загрузчик JPA и сетку объектов.

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

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

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

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

Фаза 3

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

Механизм программного взаимодействия вышеуказанных трех фаз называется object relational mapping.

Mapping.xml

Файл mapping.xml предназначен для того, чтобы указать поставщику JPA сопоставить классы Entity с таблицами базы данных.

Давайте возьмем пример сущности 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как первичный ключ этой таблицы. Теперь нам нужно создать для него файл отображения гибернации. Файл сопоставления с именем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> : tag определяет определение схемы, позволяющее использовать теги сущности в XML-файле.

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

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

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

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

  • <id>: tag определяет первичный ключ таблицы. В<generated-value> тег определяет, как назначить значение первичного ключа, например Automatic, Manual, или взяты из Sequence.

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

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

Аннотации

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

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

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

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

Стандарт Java Bean

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

Бин-соглашения

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

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

  • Небулева свойство содержит getter и setter методы.

  • Логическое свойство содержать setter и is метод.

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

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

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

В этой главе вы узнаете, как настроить 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. Пример вывода приведен в следующей таблице.

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

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

\>java –version

Версия Java "1.7.0_60"

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

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

Linux

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

$java –version

версия 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 и установить его.

Шаг 2. Настройте среду Java

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

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

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

Платформа Описание
Окна Добавьте строку «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 для разработчика JavaEE, который Eclipse indigo.

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

Установка JPA с помощью Eclipselink

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

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

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

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

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

  • Примите условия лицензии и нажмите «Готово», чтобы загрузить библиотеку.

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

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

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

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

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

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

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

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

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

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

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

  • Model or POJO

    Employee.java

  • Persistence

    Persistence.xml

  • Service

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

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

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

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

В показанной выше иерархии создайте пакет с именем ‘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;
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 и введите следующий запрос.

create database jpadb
use jpadb

Persistence.xml

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

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

<?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. Этот файл настроит базу данных.

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

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

В показанной выше иерархии пакетов создайте пакет с именем ‘com.tutorialspoint.eclipselink.service’, под ‘src’(исходный) пакет. Все классы обслуживания называются 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 на панели консоли eclipse IDE.

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

use jpadb
select * from employee

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

Ид Эмаль Зарплата Град
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 на панели консоли eclipse IDE.

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

use jpadb
select * from employee

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

Ид Эмаль Зарплата Град
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 на панели консоли eclipse IDE.

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 на панели консоли eclipse IDE.

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

use jpadb
select * from employee

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

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

В этой главе рассказывается о 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 Таблица содержит следующие записи.

Ид Эмаль Зарплата Град
1201 Гопал 40000 Технический менеджер
1202 Маниша 40000 Proof Reader
1203 Мастханвали 40000 Технический писатель
1204 Сатиш 30000 Технический писатель
1205 Кришна 30000 Технический писатель
1206 Kiran 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

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

Between, And, и Likeявляются основными ключевыми словами JPQL. Эти ключевые слова используются послеWhere clause в запросе.

Создайте класс с именем 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 - это библиотека, выпущенная со спецификациями Java. Следовательно, он поддерживает все объектно-ориентированные концепции сохранения сущностей. К настоящему времени мы закончили с основами объектно-реляционного сопоставления. В этой главе вы узнаете о расширенных сопоставлениях между объектами и реляционными сущностями.

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

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

Рассмотрим пример. На следующей диаграмме показаны три класса, а именно. Персонал, Учебный персонал и Неучебный персонал, а также их отношения.

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

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

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

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

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

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

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 указывает имя поля (type) и его значения показывают оставшиеся поля (Teaching и NonTeachingStaff).

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

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пакет. Класс NonTeachingStaff Entity показан следующим образом:

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 для вывода. Вывод в табличном формате показан следующим образом:

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

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

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

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

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

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

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

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 Entity показан следующим образом:

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пакет. Класс NonTeachingStaff Entity показан следующим образом:

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.

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

Сид Dtype Sname
1 Преподавательский состав Гопал
2 Преподавательский состав Маниша
3 Неучебный персонал Сатиш
4 Неучебный персонал Кришна

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

Сид Квалификация Subjectexpertise
1 MSC MED Математика
2 BSC КРОВАТЬ английский

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

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

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

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

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

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

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

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

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 Entity показан следующим образом:

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пакет. Класс NonTeachingStaff Entity показан следующим образом:

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.

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

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

Сид Квалификация Sname Subjectexpertise
1 MSC MED Гопал Математика
2 BSC КРОВАТЬ Маниша английский

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

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

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

Приведенная выше таблица NonTeachingStaff содержит поля как объектов Staff, так и NonTeachingStaff.

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

  • @ManyToOne Отношение
  • @OneToMany Relation
  • @OneToOne Отношение
  • @ManyToMany Relation

@ManyToOne Отношение

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

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

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

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

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

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

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 eclipse при создании проекта 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. В этом примере созданы две таблицы.

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

Select * from department
Я БЫ имя
101 Развитие

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

Select * from employee
Ид Град Эмаль Зарплата Department_Id
102 Технический писатель Сатиш 45000 101
103 Технический писатель Кришна 45000 101
104 Технический писатель Мастханвали 50000 101

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

@OneToMany Relation

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

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

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

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

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.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 следующим образом.

В этом проекте созданы три таблицы. Передайте следующий запрос в интерфейсе 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;
Ид Град Эмаль Зарплата
251 Технический писатель Сатиш 45000
252 Технический писатель Кришна 45000
253 Технический писатель Мастханвали 50000

@OneToOne Отношение

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

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

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

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

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.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 следующим образом.

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

Select * from department
Я БЫ имя
301 Развитие

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

Select * from employee
Ид Град Эмаль Зарплата Department_id
302 Технический писатель Сатиш 45000 301

@ManyToMany Relation

Отношение «многие-ко-многим» - это когда одна или несколько строк из одной сущности связаны с более чем одной строкой в ​​другой сущности.

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

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

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

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
Tid Тема Tname
354 Ява Сатиш
355 Adv Java Кришна
356 DB2 Мастханвали

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

Select * from clas
Сид Cname
351 1-й
352 2-й
353 3-й

Критерии - это предопределенный 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 instance используется для создания объекта CriteriaBuilder.

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

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

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

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

  • 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 в среде разработки eclipse с именем JPA_Eclipselink_Criteria. Все модули этого проекта обсуждаются ниже:

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

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

Создайте класс с именем Employee.javaпод данным пакетом. Сущность класса 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;
	}
	@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.

Select All records
EID : 401 Ename : Gopal
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish
EID : 405 Ename : Krishna
EID : 406 Ename : Kiran
Select All records by follow Ordering
EID : 401 Ename : Gopal
EID : 406 Ename : Kiran
EID : 405 Ename : Krishna
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish