pdf / 3-jpa
.pdfJava Persistence API
●Object/relational mapping
●POJO (Plain Old Java Object)
●Часть EJB 3.0
●Состоит из:
–The Java Persistence API
–The query language
–Object/relational mapping metadata
●Три наиболее известные реализации
–Hibernate (JBoss/RedHat)
–Toplink (Oracle)
–Kodo (Weblogic)
Требования (@Entity)
●Entity annotation (или XML descriptor)
●no-arg constructor (public или protected)
●Не должен быть final (как и его persistent методы и поля)
●Для передачи из/в Remote методы должны реализовать Serializable
●Поля должны быть уровня доступа private, protected, or package
●Необходимы get и set методы для доступа к полям
Требования (@Entity)
●Field-based или property-based access (Transient аннотация для исключения)
●Первичный ключ
●Возможны свойства типов:
–Примитивные типы
–Serializable types (cтроки, обертки над примитивными типами, ...)
–Enumerated types
–Другие entities и/или коллекции entities (Collection, Set, List, Map - поддерживаются Generic)
–Embeddable classes
Primary Key (@Id)
●Поддерживаемые типы
–Java primitive types
–Java primitive wrapper types
–java.lang.String
–java.util.Date и java.sql.Date
●Поддерживаются Compisite Primary Key (@EmbeddedId @IdClass )
●Нельзя использовать типы с плавающей точкой
●Автогенерация переносима только для интегральных типов
Composite Primary Key Class
●Public Class
●Public default конструктор
●Public (protected) properties
●Должен корректно определять hashCode() & equals()
●Serializable
@Embeddable public class ItemId implements Serializable { private String firstName, lastName;
...}
@Entity public class Item implements Serializable { @EmbeddedId private ItemId id;
...}
Relationships
●One-to-one
●One-to-many
●Many-to-one
●Many-to-many
●Есть понятие владельца связи
●Могут быть
–Bidirectional
–Unidirectional
One-to-many bidirectional
@Entity public class Employee { private Department department;
//Entity Employee is the owner of the relationship. EMPLOYEE.DEPARTMENT_ID
@ManyToOne
public Department getDepartment() { return department;
}
public void setDepartment(Department department) { this.department = department;
}...
}
@Entity public class Department {
private Collection<Employee> employees = new HashSet();
@OneToMany(mappedBy="department") public Collection<Employee> getEmployees() {
return employees;
}
public void setEmployees(Collection<Employee> employees) { this.employees = employees;
}...
}
Entity Inheritance
●Возможно наследование Entites
–The Single Table per Class Hierarchy Strategy
–The Table per Concrete Class Strategy
–The Joined Subclass Strategy
●Полиморфизм (в ассоциациях и запросах)
●Entity может быть абстрактным классом
●Возможно наличие в иерархии классов не Entity классов
●Понятие Mapped Superclasses. От него можно наследоваться, но он сам не является Entity
Возможные варианты
●Abstract Entities – не могут быть напрямую созданы
●Non-Entity Superclasses – их состояние не сохраняется в базу, аннотации (если они есть) игнорируются
●@MappedSuperclass - для выражения общего состояния разных сущностей
@Inheritance(strategy=Inheritan ceType.SINGLE_TABLE)
●Вся иерархия классов хранится в одной таблице
●Есть колонка @DiscriminatorColumn (по умолчанию DTYPE)
●Сильные стороны:
–Высокая производительность
–Хорошая поддержка полиморфизма
●Недостатки
–Рост числа колонок в таблице
–Необходимость значений по умолчанию или nullable полей для всех потомков