Вы находитесь на странице: 1из 10

СОДЕРЖАНИЕ

1 ЛАБОРАТОРНАЯ РАБОТА №4.2.........................................................................2


1.1 Создание проектов с JPA в Eclipse.........................................................2
1.1.1 Порядок выполнения работы.......................................................................2
1.1.2 Содержание отчета........................................................................................3
1.2 EntityManager. Манипулирование данными в проектах с JPA............3
1.2.1 Порядок выполнения работы.......................................................................3
1.2.2 Содержание отчета......................................................................................10
1 ЛАБОРАТОРНАЯ РАБОТА №4.2

1.1 Создание проектов с JPA в Eclipse


Цель работы: Создать и настроить JPA-проект в Eclipse и связать его с
выбранной БД.
1.1.1 Порядок выполнения работы
1. Изучить состав и правила создания JPA-проектов в Eclipse;
2. Создать в конкретной СУБД, например, PostgreSQL или MySQL
собственную БД, содержащую таблицы между которыми установлены связи
типа один-ко-многим, многие-ко-многим и один-к-одному. Например, в БД
"Автопарк" эта информация хранится в 5-ти таблицах – ROUTES, BUSSES,
DRIVERS, DRIVING_LICENSES и BUSSESDRIVERS.

Рисунок 1.1 - Логическая модель автопарка


3. Заполнить таблицы БД достаточным количеством строк для
демонстрации указанных типов связей (порядка 5-ти записей в каждой таблице);
4. Задать стандартную среду выполнения Standard VM Java по
умолчанию как jdk, а не jre;
5. Создать проект с JPA;
6. Настроить Target runtime и выбрать конфигурацию среды
выполнения;
7. Настроить JPA Facet:
1) выбрать платформу EclipseLink;
2) выбрать версию JPA;
3) выбрать и загрузить в требуемую папку библиотеку с реализацией
EclipseLink;
8. Настроить соединение с БД:
1) выбрать тип СУБД;
2) задать имя соединения;
3) выбрать требуемый jdbc-драйвер;
4) настроить параметры соединения;
5) проверить соединение;
9. Создать пакет для представления сущностей;
10.Создать классы приложения на основе таблиц БД. Настроить мэппинг
и получить взаимосвязи между классами. Для этого выполнить:
1) подключение БД. Автоматически будут получены связи один-ко-
многим и многие-ко-многим;
2) дополнительные действия для генерации взаимосвязи один-к-
одному;
3) настройку каскадной обработки созданных связей;
11.Выполнить генерацию отображения таблиц в классы. Для этого
выполнить:
1) настроить способ генерации ключей;
2) настроить тип коллекций;
3) получить требуемые классы;
12.В отдельных классах реализовать основные методы бизнес-логики
работы с данными в БД:
1) добавление данных;
2) удаление данных;
3) обновление данных;
13.Разработать небольшое приложение, в котором выполняется вставка
данных, связанных отношением:
1) один-ко-многим;
2) многие-ко-многим;
3) один-к-одному;
1.1.2 Содержание отчета
1. Модель БД;
2. Схема созданной БД.
3. Копии экранов, отражающих процесс создания проекта;
4. Структура полученного проекта;
5. Содержимое полученных классов-сущностей;
6. Содержимое классов, реализующих бизнес-логику работы с данными;
7. Приложение, в котором реализованы операций вставки, удаления и
замены данных для всех типов связей между сущностями;
8. Копии содержимого таблиц, иллюстрирующих выполнение операций
вставки, удаления и замены данных для всех типов связей между сущностями.

1.2 EntityManager. Манипулирование данными в


проектах с JPA
Цель работы: Выполнение добавления, удаления и обновления сущностей в
JPA-проекте.
1.2.1 Порядок выполнения работы
1. Изучить правила использования интерфейса EntityManager;
2. Изучить состав и правила использования методов интерфейса Entity-
Manager для создания, чтения, записи, изменения и удаления из БД сущностей
по их первичным ключам;
3. Создать фабрику EntityManagerFactory для работы с сущностями
конкретного Persistence Unit;
4. Создать менеджер EntityManager для работы с сущностями
конкретного Persistence Unit;
5. Реализовать и проиллюстрировать результаты манипулирования
сущностями, участвующими в связях с другими сущностями:
1) чтение;
2) запись;
3) изменение;
4) удаление.
Уточнение этого задания показано для приведенной модели, например,
PostgreSQL или MySQL собственную БД, содержащую таблицы между
которыми установлены связи типа один-ко-многим, многие-ко-многим и один-
к-одному. Например, в БД "Автопарк" эта информация хранится в 5-ти
таблицах – Routes, Busses, Drivers, Driving_Licenses и BussesDrivers.

Рисунок 1.2 - Логическая модель автопарка


6. Выполнить добавление в БД отдельных сущностей и связей между
ними, используя команду persist().

MakeDB.java
package db.logic;

import db.entity.Automobile;
import db.entity.Bus;
import db.entity.Car;
import db.entity.Driver;
import db.entity.Route;
import db.entity.DrivingLicense;

import java.util.*;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MakeDB {


//Для генерации ключей используется IDENTITY
private static final String PERSISTENCE_UNIT_NAME = "AutoPark-PU";
//Имя модуля сохранения в persistence.xml
public void makeDB() throws Exception {
//Создаем фабрику для работы с сущностями в статическом блоке
EntityManagerFactory emf = Persistence.createEntityManagerFactory(PER-
SISTENCE_UNIT_NAME);
//Создаем Entity Manager для работы с сущностью
EntityManager em = emf.createEntityManager();

try{
em.getTransaction().begin();

//Создание объекта route


Route route1 = new Route();
route1.setName("Лесная-Позняки");
route1.setNumber("526");
route1.setBusses(new LinkedList<Bus>());

Route route2 = new Route();


route2.setName("Нивки-Позняки");
route2.setNumber("575");
route2.setBusses(new LinkedList<Bus>());

//Создание объекта bus1 и его добавление в коллекцию автобусов у


маршрута
Bus bus1 = new Bus();
bus1.setNumber("AA3456CC");
bus1.setType("Mersedes");
bus1.setNmbSeats(40);
bus1.setRoute(route1);
bus1.setDrivers(new LinkedList<Driver>());
route1.getBusses().add(bus1); //Добавление в коллекцию автобусов у
маршрута

//Создание объекта bus2 и его добавление в коллекцию автобусов у


маршрута
Bus bus2 = new Bus();
bus2.setNumber("AA2345BB");
bus2.setType("Renault");
bus2.setNmbSeats(45);
bus2.setRoute(route2);
bus2.setDrivers(new LinkedList<Driver>());
route2.getBusses().add(bus2); //Добавление в коллекцию автобусов у
маршрута

//Создание объекта car1


Car car1 = new Car();
car1.setNumber("CB2345EE");
car1.setType("Skoda");
car1.setCarOwner("Иванов");
car1.setDrivers(new LinkedList<Driver>());

// Создание объекта car2


Car car2 = new Car();
car2.setNumber("CB3456HH");
car2.setType("Volkswagen");
car2.setCarOwner("Петров");
car2.setDrivers(new LinkedList<Driver>());

//Создание объекта drv1


Driver drv1 = new Driver();
drv1.setAddress(null);
drv1.setDrivingLicens(null);
drv1.setName("Иванов");
drv1.setSurname("Иван");
drv1.setAutomobiles(new LinkedList<Automobile>());
//Добавление водителя drv1 в коллекцию водителей у автобусов
drv1.getAutomobiles().add(car1); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//car1.getDrivers().add(drv1); //Для сохранения в БД не требуется.
Класс Car инверсная сторона связи
drv1.getAutomobiles().add(bus1); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//bus1.getDrivers().add(drv1); //Для сохранения в БД не требуется.
Класс Bus инверсная сторона связи

// Создание объекта drv2


Driver drv2 = new Driver();
drv2.setAddress(null);
drv2.setDrivingLicens(null);
drv2.setName("Петров");
drv2.setSurname("Петр");
drv2.setAutomobiles(new LinkedList<Automobile>());
//Добавление водителя drv1 в коллекцию водителей у автобусов
drv2.getAutomobiles().add(car2); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//car2.getDrivers().add(drv2); //Для сохранения в БД не требуется.
Класс Car инверсная сторона связи
drv2.getAutomobiles().add(bus2); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//bus2.getDrivers().add(drv2); //Для сохранения в БД не требуется.
Класс Bus инверсная сторона связи

//em.persist(route1); //Не требуется. Класс Route инверсная сторона


связи
//em.persist(route2); //Не требуется. Класс Route инверсная сторона
связи
//em.persist(bus1); //Не требуется. Класс Bus инверсная сторона
связи
//em.persist(bus2); //Не требуется. Класс Bus инверсная сторона
связи
//em.persist(car1); //Не требуется. Класс Car инверсная сторона
связи
//em.persist(car2); //Не требуется. Класс Car инверсная сторона
связи
em.persist(drv1); //Достаточно для сохранения в БД. Класс Driver
владелец связи
em.persist(drv2); //Достаточно для сохранения в БД. Класс Driver
владелец связи

em.getTransaction().commit();

} catch (Exception e) {
// Обрабатываем ошибки
e.printStackTrace();
}
}
}

Листинг 1.1 - Добавление сущностей и связей между ними,


используя команду persist()
7. Выполнить добавление в БД отдельных сущностей и их партнеров по
связям, используя команду merge().
MakeDB.java
package db.logic;

import db.entity.Automobile;
import db.entity.Bus;
import db.entity.Car;
import db.entity.Driver;
import db.entity.Route;
import db.entity.DrivingLicense;

import java.util.*;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MakeDB {


//Для генерации ключей используется IDENTITY
private static final String PERSISTENCE_UNIT_NAME = "AutoPark-PU";
//Имя модуля сохранения в persistence.xml
public void makeDB() throws Exception {
//Создаем фабрику для работы с сущностями в статическом блоке
EntityManagerFactory emf = Persistence.createEntityManagerFactory(PER-
SISTENCE_UNIT_NAME);
//Создаем Entity Manager для работы с сущностью
EntityManager em = emf.createEntityManager();

try{
em.getTransaction().begin();

//Создание объекта route


Route route1 = new Route();
route1.setName("Лесная-Позняки");
route1.setNumber("526");
route1.setBusses(new LinkedList<Bus>());

Route route2 = new Route();


route2.setName("Нивки-Позняки");
route2.setNumber("575");
route2.setBusses(new LinkedList<Bus>());

//Создание объекта bus1 и его добавление в коллекцию автобусов у


маршрута
Bus bus1 = new Bus();
bus1.setNumber("AA3456CC");
bus1.setType("Mersedes");
bus1.setNmbSeats(40);
bus1.setRoute(route1);
bus1.setDrivers(new LinkedList<Driver>());
route1.getBusses().add(bus1); //Добавление в коллекцию автобусов у
маршрута

//Создание объекта bus2 и его добавление в коллекцию автобусов у


маршрута
Bus bus2 = new Bus();
bus2.setNumber("AA2345BB");
bus2.setType("Renault");
bus2.setNmbSeats(45);
bus2.setRoute(route2);
bus2.setDrivers(new LinkedList<Driver>());
route2.getBusses().add(bus2); //Добавление в коллекцию автобусов у
маршрута

//Создание объекта car1


Car car1 = new Car();
car1.setNumber("CB2345EE");
car1.setType("Skoda");
car1.setCarOwner("Иванов");
car1.setDrivers(new LinkedList<Driver>());
// Создание объекта car2
Car car2 = new Car();
car2.setNumber("CB3456HH");
car2.setType("Volkswagen");
car2.setCarOwner("Петров");
car2.setDrivers(new LinkedList<Driver>());

//Создание объекта drv1


Driver drv1 = new Driver();
drv1.setAddress(null);
drv1.setDrivingLicens(null);
drv1.setName("Иванов");
drv1.setSurname("Иван");
drv1.setAutomobiles(new LinkedList<Automobile>());
//Добавление водителя drv1 в коллекцию водителей у автобусов
drv1.getAutomobiles().add(car1); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//car1.getDrivers().add(drv1); //Для сохранения в БД не требуется.
Класс Car инверсная сторона связи
drv1.getAutomobiles().add(bus1); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//bus1.getDrivers().add(drv1); //Для сохранения в БД не требуется.
Класс Bus инверсная сторона связи

// Создание объекта drv2


Driver drv2 = new Driver();
drv2.setAddress(null);
drv2.setDrivingLicens(null);
drv2.setName("Петров");
drv2.setSurname("Петр");
drv2.setAutomobiles(new LinkedList<Automobile>());
//Добавление водителя drv1 в коллекцию водителей у автобусов
drv2.getAutomobiles().add(car2); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//car2.getDrivers().add(drv2); //Для сохранения в БД не требуется.
Класс Car инверсная сторона связи
drv2.getAutomobiles().add(bus2); //Достаточно для сохранения в БД.
Класс Driver владелец связи
//bus2.getDrivers().add(drv2); //Для сохранения в БД не требуется.
Класс Bus инверсная сторона связи

//em.merge(route1); //Не требуется. Класс Route инверсная сторона


связи
//em.merge(route2); //Не требуется. Класс Route инверсная сторона
связи
//em.merge(bus1); //Не требуется. Класс Bus инверсная сторона
связи
//em.merge(bus2); //Не требуется. Класс Bus инверсная сторона
связи
//em.merge(car1); //Не требуется. Класс Car инверсная сторона
связи
//em.merge(car2); //Не требуется. Класс Car инверсная сторона
связи

em.merge(drv1); //Достаточно для сохранения в БД. Класс Driver


владелец связи
em.merge(drv2); //Достаточно для сохранения в БД. Класс Driver
владелец связи
em.getTransaction().commit();
} catch (Exception e) {
//Обрабатываем ошибки
e.printStackTrace();
}
}
}

Листинг 1.2 - Добавление сущностей и связей между ними,


используя команду merge()
8. Выполнить удаление из БД отдельных сущностей и их партнеров по
связям, используя команду remove().
1.2.2 Содержание отчета
9. Приложение, в котором реализованы операций вставки, удаления и
замены данных для всех типов связей между сущностями;
10. Для соответствующего фрагмента кода копии содержимого таблиц БД,
иллюстрирующих выполнение операций вставки, удаления и замены данных для
всех типов связей между сущностями до и после выполнения этого фрагмента
кода.

Вам также может понравиться