Академический Документы
Профессиональный Документы
Культура Документы
2
1.1 Порядок выполнения работы.................................................................2
1.2 Содержание отчета................................................................................18
1 ЛАБОРАТОРНАЯ РАБОТА № 5.3
Использование GenericDAO и DomainSuperClass в проектах с JPA
(2 часа)
Цель работы: Разработка и имплементация интерфейсов GenericDAO и Do-
mainSuperClass.
Рисунок 1.1 -
3. В папке с классами-сущностями создать класс DomainSuperClass
(Листинг 1 .1). В данном примере имеет только одно поле
protected java.lang.Integer Id
DomainSuperClass.java
package db.entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
* ВНИМАНИЕ! Необходимо принудительно вставить суперкласс
* db.entity.DomainSuperClass в persistence.xml
*/
@MappedSuperclass
public abstract class DomainSuperClass implements Serializable {
private static final long serialVersionUID = 1L;
/** Суррогатный уникальный первичный ключ */
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected java.lang.Integer Id;
public DomainSuperClass() {
}
/**
* ДРУГИЕ ОБЩИЕ ПОЛЯ ДОМЕНОВ И ИХ Get и Set
*/
/**
* Gets the id value for this DomainSuperClass.
* @return id
*/
public java.lang.Integer getId() {
return Id;
}
/**
* Sets the id value for this DomainSuperClass.
* @param id
*/
public void setId(java.lang.Integer Id) {
this.Id = Id;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((Id == null) ? 0 : Id.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (!DomainSuperClass.class.isAssignableFrom(obj.getClass())) return
false;
DomainSuperClass other = (DomainSuperClass) obj;
if (Id == null) {
if (other.Id != null) return false;
} else if (!Id.equals(other.Id)) return false;
return true;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
/*@Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
*/
}
Листинг 1.1 –
4. Внимание! Необходимо принудительно вставить суперкласс db.enti-
ty.DomainSuperClass в файл persistence.xml (Листинг 1 .2)
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="AutoPark-PU">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
Листинг 1.2 -
5. Классы-сущности представить как наследники класса DomainSuper-
Class, например, класс Buss в папке db.entity (Листинг 1 .3)
Buss.java
package db.entity;
import java.io.Serializable;
import javax.persistence.*;
import java.util.List;
/**
* The persistent class for the busses database table.
*/
@Entity
@Table(name="busses")
@AttributeOverride(name="Id", column=@Column(name="bus_id"))
@NamedQuery(name="Buss.findAll", query="SELECT b FROM Buss b")
public class Buss extends DomainSuperClass implements Serializable {
/*
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="BUSSES_BUSID_GENERATOR" )
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="BUSSES_BUSID_GENERATOR")
@Column(name="bus_id")
private Integer busId;
*/
private String number;
public Buss() {
}
}
Листинг 1.3 -
6. Создать интерфейсный класс обобщенных операций для всех DAO-
классов IGenericDAO (Листинг 1 .4)
IGenericDAO.java
package db.DAO.interf;
import java.util.Collection;
/**
* Сохраняем новый объект в базу данных.
* @param entity
* Объект для сохранения
* @return Обработанный объект
* @throws Exception
*/
public void save(T entity) throws Exception;
/**
* Обновляем объект в базе данных.
* @param entityId
* Уникальный идентификатор объекта
* @param entity
* Объект для обновления
* @return Обработанный объект
* @throws Exception
*/
/**
* Удаление объекта из базы данных
* @param entityId
* Уникальный идентификатор объекта
* @throws Exception
*/
public void delete(Integer entityId) throws Exception;
/**
* Удаление объекта из базы данных
* @param entity
* Объект для удаления
* @throws Exception
*/
public void delete(T entity) throws Exception;
public void update(T entity) throws Exception;
/**
* Находим объект по его уникальному идентификатору
* @param entityId
* Уникальный идентификатор объекта
* @return Найденный объект или <code>null</code>
* @throws Exception
*/
/**
* Получаем коллекцию всех объектов
* @return Коллекция всех объектов
* @throws Exception
*/
public Collection<T> getAll() throws Exception;
Листинг 1.4 -
7. Создать класс реализации обобщенных операций GenericDAOImpl
(Листинг 1 .5)
GenericDAOImpl.java
package db.DAO.impl;
import db.DAO.interf.IGenericDAO;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
/**
* Реализация общих методов для всех сущностей
* в интерфейсе IGenericDAO
* @param <T>
*/
//import ua.cn.stu.oop.example.exception.PersistenceException;
Листинг 1.5 -
8. Выполнить модификацию интерфейсных DAO-классов для всех
сущностных классов, с учетом наследования от класса IGenericDAO. Для
интерфейсного класса IBussDAO это имеет вид (Листинг 1 .6)
IBussDAO.java
package db.DAO.interf;
import db.entity.Buss;
import db.entity.Driver;
import db.entity.Route;
import db.DAO.interf.IGenericDAO;
import java.util.Collection;
import db.DAO.interf.IBussDAO;
import db.entity.Buss;
import db.entity.Driver;
import db.entity.Route;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
//import ua.cn.stu.oop.example.exception.PersistenceException;
/*
public void saveBus(Buss bus) throws Exception {
save(bus);
}
*/
/*
public void updateBus(Buss bus) throws Exception {
update(bus);
}
*/
/*
public void deleteBus(Buss bus) throws Exception {
delete(bus);
}
*/
/*
public Integer getAllBusCount() throws Exception {
return getAllCount();
}
*/
/*
public Buss getBusById(Integer bus_id) throws Exception {
return getById(bus_id);
}
*/
@SuppressWarnings("unchecked")
public Collection<Buss> getAllBusses() throws Exception {
List<Buss> busses = null;
// Начало новой локальной транзакции, после чего можно получить все
сущности
try {
em = emf.createEntityManager();
em.getTransaction().begin();
/* // форматирование текста QUERY_SELECT_ALL по формату %s
String queryString = String.format(QUERY_SELECT_ALL, "Buss");
// или так
String queryString = String.format(QUERY_SELECT_ALL, entity.get-
Class().getSimpleName());
Query query = em.createQuery(queryString);
*/
Query query = em.createQuery(" select b from Buss b ");
busses = (List<Buss>) query.getResultList();
em.getTransaction().commit();
} catch (Exception e) {
new Exception("Ошибка 'getAll'", e.getCause());
}
finally {
if (em != null && em.isOpen()) {
em.close();
}
}
return busses;
}
/*
public Collection<Buss> getAllBusses() throws Exception {
return getAll();
}
*/