Содержание
-
Введение
-
Лабораторная работа №1
-
Лабораторная работа №2
-
Лабораторная работа №3
-
Лабораторная работа №4
Лабораторная работа №4 Применение технологии ORM на базе технологии Hibernate. Операции CRUD
Цель работы- Расширить знания по работе с базой данных (БД) из приложения, разработанного на языке Java.
- Разобраться и применить ORM-подход на базе технологии Hibernate.
- Запустить приложение в серверной среде и применить ORM-подход на практике.
- Eclipse
- Maven 3
- JDK 1.6
- Jetty
- Hibernate 3
- MySql
- Понимание технологии Servlets из Java EE.
- Понимание принципов работы с БД и их создание.
- Понимание сущностей БД, а также операций по работе с ними (CRUD).
ORM (объектно-реляционное отображение) – технология, которая создает связи между базой данных и концепциями объектно-ориентированных языков, методом создания «виртуальных объектных баз данных».
Существуют как платные, так и открытые реализации этой технологии. В объектно-ориентированном программировании объекты в приложении используются объекты из реального мира. В качестве примера рассмотрим адресную книгу, которая содержит список людей с любым количеством телефонов и иным набором адресов. В терминологии объектно-ориентированного программирования они являются объектами класса «Человек», которые может содержать список полей таких как: имя, список телефонов и список адресов. Суть задачи состоит в преобразовании таких объектов в форму, в которой они могут быть сохранены в базе данных, и которые легко могут быть извлечены при необходимости, с сохранением всех свойств объектов и отношений связей между ними. Такие объекты называют «хранимыми» (). При использовании ORM-подхода при разработке приложения программисты работают с обычными классами, которые в свою очередь имеют отображение в виде таблиц в БД (см. рисунок ниже).
Рисунок 17. Отображение модели приложение в БД
JPA является набором разработанных интерфейсов, которые представлены компанией Sun, с большим количеством реализаций.
Наиболее популярная реализация представлена компанией JBoss – Hibernate.import java.util.List;
import javax.persistence.*;
@javax.persistence.SequenceGenerator( name=»SEQ_ID», sequenceName=»SEQ_ID» ) @Entity @Table(name=»CATALOG») public class Catalog {
private Long id; private String name; private List<CatalogItem> items;
@Id @GeneratedValue(generator=»SEQ_ID») @Column(name=»ID») public Long getId() { return id; } public void setId(Long id) { this.id = id; }
@Column(name=»NAME») public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) @JoinColumn(name=»CATALOG_ID», nullable = false) public List<CatalogItem> getItems() { return items; } public void setItems(List<CatalogItem> items) { this.items = items; } }
Для создания сущности представления используется аннотация @Entity, которая помечает класс и обозначает, что данный класс будет иметь представление в БД. С помощью аннотации @Table можно указать, на какую таблицу БД будет происходить наложение сущности. С помощью аннотации @Column задается наложение полей объекта на поля в таблице. Библиотека HibernateHibernate – библиотека языка Java, разработанная для решения задач объектно-реляционного отображения.
Является свободно распространяемой библиотекой с открытым исходным кодом. Hibernate предоставляет собой простой фреймворк для отображения объектноориентированной модели данных в реляционные таблицы базы данных. Основным конфигурационным файлом для Hibernate является файл hibernate.cfg.xml. В нем прописываются основные настройки для подключения и работе приложения с БД. Пример конфигурации Hibernate приведен ниже.<?xml version=»1.0″ encoding=»UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC «-//Hibernate/Hibernate Configuration DTD 3.0//EN» «http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd»> <hibernate-configuration> <session-factory> <property name=»hibernate.dialect»>org.hibernate.dialect.MySQLDialect</property> <property name=»hibernate.connection.driver_class»>com.mysql.jdbc.Driver</property> <property name=»hibernate.connection.url»>jdbc:mysql://localhost:3306/hibernateArt</pro perty> <property name=»hibernate.connection.username»>root</property> <property name=»hibernate.connection.password»>csanurag</property> <property name=»hibernate.hbm2ddl.auto»>update</property> <property name=»hibernate.current_session_context_class»>thread</property> <mapping class=»model.Course»/> </session-factory> </hibernate-configuration>
Практическая часть 1. Установить и настроить MySQL. 2. Найти и прописать новую зависимость для maven Hibernate, затем пересобрать проект.<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.5.6-Final</version> </dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> 3. Создать БД и таблицу для хранения пользователей.create database UserDB; use UserDB; grant all on UserDB.* to ‘admin’@’localhost’ identified by ‘test’; CREATE TABLE UserDB.`users` ( `userid` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(45) DEFAULT NULL, `lastname` varchar(45) DEFAULT NULL, `dob` date DEFAULT NULL, `email` varchar(100) DEFAULT NULL, PRIMARY KEY (`userid`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
4. Открыть проект и создать новый пакет для работы с сущностями БД 5. Создать класс User для представления пользователей с указанием полей, как в примере Long userid, String firstName, String lastName, Date dob, String email. 6. Создать и настроить hibernate.cfg.xml для проекта. 7. Создать утилитный класс для работы с БД через сущности.package com.daniel.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml return new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println(«Initial SessionFactory creation failed.» + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
8. Создать и настроить UserDao для работы с БД через утилитный класс HibernateUtil.package com.daniel.dao; import java.util.ArrayList; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.daniel.model.User; import com.daniel.util.HibernateUtil; public class UserDao { public void addUser(User user) { Transaction trns = null; Session session = HibernateUtil.getSessionFactory().openSession(); try { trns = session.beginTransaction(); session.save(user); session.getTransaction().commit(); } catch (RuntimeException e) { if (trns != null) { trns.rollback(); } e.printStackTrace(); } finally { session.flush(); session.close(); } } public void deleteUser(int userid) { Transaction trns = null; Session session = HibernateUtil.getSessionFactory().openSession(); try { trns = session.beginTransaction(); User user = (User) session.load(User.class, new Integer(userid)); session.delete(user); session.getTransaction().commit(); } catch (RuntimeException e) { if (trns != null) { trns.rollback(); } e.printStackTrace(); } finally { session.flush(); session.close(); } } public void updateUser(User user) { Transaction trns = null; Session session = HibernateUtil.getSessionFactory().openSession(); try { trns = session.beginTransaction(); session.update(user); session.getTransaction().commit(); } catch (RuntimeException e) { if (trns != null) { trns.rollback(); } e.printStackTrace(); } finally { session.flush(); session.close(); } } public List<User> getAllUsers() { List<User> users = new ArrayList<User>(); Transaction trns = null; Session session = HibernateUtil.getSessionFactory().openSession(); try { trns = session.beginTransaction(); users = session.createQuery(«from User»).list(); } catch (RuntimeException e) { e.printStackTrace(); } finally { session.flush(); session.close(); } return users; } public User getUserById(int userid) { User user = null; Transaction trns = null; Session session = HibernateUtil.getSessionFactory().openSession(); try { trns = session.beginTransaction(); String queryString = «from User where id = :id»; Query query = session.createQuery(queryString); query.setInteger(«id», userid); user = (User) query.uniqueResult(); } catch (RuntimeException e) { e.printStackTrace(); } finally { session.flush(); session.close(); } return user; } }
9. Создать несколько сервлетов и форм для отправки данных на сервер, а также их отображение. 10. Необходимо создать сочетание jsp и сервлетов для сохранения, чтения, обновления и удаления данных из БД. В качестве управления данными в БД следует использовать зависимость на UserDao в сервлетах. 11. Собрать и запустить приложение. 12. Проверить работу функциональности CRUD операций. Отчет о выполнении работы 1. Файлы исходного кода реализованной логики. Вопросы для самопроверки 1. Какие особенности имеются у ORM-подхода? 2. Как создается отображение на несколько таблиц? 3. Что такое транзакция? Литература 1. http://mrbool.com/crud-operation-in-hibernate/26236 – создание CRUD операций. 2. http://docs.jboss.org/hibernate/core/3.6/quickstart/en-US/html_single/ — документация по Hibernate. 3. http://javaxblog.ru/article/java-hibernate-1/ – разработка на Hibernate.
