persistenceejb3.0 mikhail moscow
TRANSCRIPT
1
Постоянство в Постоянство в Java SE и Java EEJava SE и Java EE
на базе на базеEJB 3.0 PersistenceEJB 3.0 Persistence
Mikhail KondratyevMikhail [email protected]@sun.com
Sun Microsystems, Inc.Sun Microsystems, Inc.
2
Содержание
• Требования к EJB 3.0 Persistence • Программная модель EJB 3.0 Persistence• Entity, их жизненный цикл и управление им• Entity Listeners• Отсоединенные Entity• O/R Mapping• Отношения между Entity • Запросы• GlassFish
Требования к EJB 3.0 Требования к EJB 3.0 PersistencePersistence
4
Требования к EJB 3.0 Persistence
• Упрощение модели постоянства• Облегченная модель
> В терминах программирования, развертывания и выполнения
• Моделирование домена через наследование и полиморфизм
• Object/Relational (O/R) mapping • Исчерпывающие возможности запросов
5
Общая модель постоянства для Java:JSE и JEE
• EJB 3.0 Persistence может использоваться вне JEE• Эволюция в 'общую' технологию Java persistence
> Обобщение опыта Hibernate, JDO, TopLink, EJB разработчиков
> API на основе всех этих источников
• Поддержка сторонних реализаций модели постоянства
Программная МодельПрограммная МодельEJB 3.0 PersistenceEJB 3.0 Persistence
7
Программная модель EJB 3.0 Persistence
• Основной объект Java Persistence – Entity • Entity являются обычными Java классами.• Использование аннотаций для описания Entity// @Entity - аннотация
// Аннотирование Employee как Entity
@Entity
public class Employee {
// Persistent/transient fields
// Property accessor methods
// Persistence logic methods
}
8
Пример Entity класса@Entity public class Customer { private Long id; private String name; private Address address; private Collection<Order> orders = new HashSet();
public Customer() {}
@Id public Long getID() { return id; } protected void setID (Long id) { this.id = id; }
...
Аннотирован как “Entity”
Getters/setters для доступа к полям класса
@Id объявляет первичный ключ
9
Пример Entity класса (продолжение)...
// Отношение между Customer и Order @OneToManypublic Collection<Order> getOrders() { return orders;}
public void setOrders(Collection<Order> orders) { this.orders = orders;}
// Прочие бизнес методы...
}
10
Пример использования Entity
@Stateless public class OrderEntry {
// Указание Entity Менеджера для persistence модуля@PersistenceContextEntityManager entMngr;
public void enterOrder(int custID, Order newOrder){
// Использование find метода для поиска Customer c = entMngr.find(Customer.class, custID); // Добавление нового объекта Order c.getOrders().add(newOrder); newOrder.setCustomer(c); }
// прочие бизнес методы}
Жизненный цикл Жизненный цикл EntityEntity
12
Жизненный цикл Entity
Класс EntityManagerКласс EntityManager
14
EntityManager
• Управление жизненным циклом объектов > persist() - сохранение entity в базу данных> remove() - удаление entity из базы данных> merge() - синхронизовать состояние отсоединенных entity
15
Операция persist
public Order createNewOrder(Customer customer) {Order order = new Order(customer);
// Превращает новые объекты в управляемые // При следующем вызове flush или завершении // транзакции данные будут вставлены в базу
entityManager.persist(order);
return order;}
16
Операции поиска и удаления
public void removeOrder(Long orderId) {Order order =
entityManager.find(Order.class, orderId);
// Объект будет удален из базы при следующем вызове flush или завершении транзакцииentityManager.remove(order);
}
17
Операция merge
public OrderLine updateOrderLine(OrderLine orderLine) { // Метод merge возвращает управляемую копию // отсоединенного объекта.
return entityManager.merge(orderLine);}
18
Отсоединенные Entity
• Должны реализовывать Serializable для пересылки между удаленными машинами
• Операция merge может выполняться каскадно
Обработчики событийОбработчики событий
20
Обработчики событий
• Обработчики и callback методы предназначены для вызова persistence провайдером при различных событиях жизненного цикла
• Callback методы > Методы могут быть определены с помощью аннотаций в
тексте самого Entity или помещены в отдельный класс> Аннотации:
> PrePersist / PostPersist> PreRemove/ PostRemove> PreUpdate / PostUpdate> PostLoad
21
Entity Listeners: пример – 1
@Entity@EntityListener(com.acme.AlertMonitor.class)public class AccountBean implements Account {
Long accountId;Integer balance;boolean preferred;public Long getAccountId() { ... }public Integer getBalance() { ... }
@Transient contextpublic boolean isPreferred() { ... }
public void deposit(Integer amount) { ... }public Integer withdraw(Integer amount) throws NSFException { ... }
}
22
Entity Listeners: пример – 2
@PrePersistpublic void validateCreate() {
if (getBalance() < MIN_REQUIRED_BALANCE)throw new AccountException("Insufficient balance to
open an account");}
@PostLoadpublic void adjustPreferredStatus() {
preferred =(getBalance() >= AccountManager.getPreferredStatusLevel());
}
23
Entity Listeners: пример – 3
public class AlertMonitor {
@PostPersistpublic void newAccountAlert(Account acct) {
Alerts.sendMarketingInfo(acct.getAccountId(), acct.getBalance());
}}
O/R MappingO/R Mapping
25
O/R Mapping
• Множество аннотаций для описания> Отношений> Joins> Используемых таблиц и колонок> Генераторов последовательностей> И многого другого
• O/R mapping может задаваться как в тексте самого класса, так и в специальном файле
26
Простая привязка к базе данных
CUSTOMER
ID NAME C_RATING PHOTO
@Entity
@Id
@Lob
public class Customer {
int id;
String name;
int c_rating;
Image photo;}
27
public class Customer {
int id;
String name;
int c_rating;
Image photo;}
Простая привязка к базе данных
@Entity
@Column(name=“CREDIT”)
@Id
@Lob
CUSTOMER
ID NAME CREDIT PHOTO
28
O/R Mapping: примеры@Entity@Table(name="EMPLOYEE")public class Employee {
...@Column(name="NAME", nullable=false, length=30)public String getName() { return name; }
}
@Version@Column(name="OPTLOCK")protected int getVersionNum() { return versionNum; }
@ManyToOne@JoinColumn(name="ADDR_ID")public Address getAddress() { return address; }
Entity и отношенияEntity и отношения
30
Отношения
• Моделируют связи между entity• Поддерживаются однонаправленные и
двунаправленные отношения> Однонаправленное отношение: Entity A ссылается на B, но
B не ссылается на A
• Варианты отношений> Один к одному> Один ко многим> Многие к одному> Многие ко многим
31
Отношения: примерMany to Many
@Entitypublic class Project {
private Collection<Employee> employees;
@ManyToManypublic Collection<Employee> getEmployees() {
return employees;}
public void setEmployees(Collection<Employee> employees) {this.employees = employees;
}...}
32
Каскадное поведение
• Необходимо для распространения операции на связанные сущности
• Cascade=PERSIST• Cascade=REMOVE• Cascade=MERGE• Cascade=REFRESH• Cascade=ALL
Поддержка Поддержка наследованиянаследования
34
НаследованиеПривязка классов к таблицам
• Использование аннотаций• Поддержка разичных стратегий наследования
> Единая таблица> Все классы иерархии связываются с одной таблицей> В таблице описывается специальное поле для указания класса
> Отдельная таблица для каждого класса > Каждый класс привязывается к отдельной таблице, содержащей все
необходимыe данные> Присоединенные таблицы подклассов
> Корневой класс иерархии представляется одной таблицей> Каждый подкласс представляется одной таблицей, содержащей
специфичные для него данные
35
Пример описания наследования
@Entity @Table(name=”CUST”)@Inheritance(strategy=SINGLE_TABLE, discriminatorType=STRING, discriminatorValue=”CUST”)public class Customer {...}
@Entity@Inheritance(discriminatorValue=”VCUST”)public class ValuedCustomer extends Customer{...}
Первичные ключи Первичные ключи
37
Первичные ключи и идентификация Entity• И простые, и композитные ключи должны быть
сериализуемы• Поддержка композитных ключей
> Должен быть определен класс, представляющий первичный ключ
> В качестве класса первичного ключа могут использоваться встроенные классы
> Композитный ключ привязывается к полю/полям Entity
38
Встраиваемые объекты
• @Embeddable используется для указания встраиваемого объекта
• Встраиваемый объект сохраняется как внутренняя часть внешнего объекта> Использует идентификатор родительского объекта, своего
идентификатора не имеет
39
Встраиваемые объекты - пример
@Embeddable(access=FIELD)public class EmploymentPeriod {
java.util.Date startDate;java.util.Date endDate;
}
@Embeddedpublic EmploymentPeriod getEmploymentPeriod() { ... }
ЗапросыЗапросы
41
Улучшения в EJB-QL
• Множественные удаления и обновления• Group By / Having• Подзапросы• Дополнительные функции SQL функции
> UPPER, LOWER, TRIM, CURRENT_DATE, ...• Полиморфные запросы• Именованные и динамические запросы
42
Полиморфные запросы
• Все запросы по умолчанию полиморфны> Это означает что FROM часть описывает не только
объекты конкретного класса, но и всех его подклассов
select avg(e.salary) from Employee e where e.salary > 80000
43
Joins
• Поддержка> Inner Joins> Left Joins> Fetch join
SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.orders WHERE c.address.state = 'MA'
44
Динамические запросы
// Построение и выполнение запросов в runtime.
public List findWithName (String name) { Query q = em.CreateQuery ( “SELECT c FROM Customer c” + “WHERE c.name LIKE :custName”); q.setParameter(“custName”, name); q.setMaxResults(10) return q.getResultList();}
45
Именованные запросы
// Удобны для создания переиспользуемых запросов@NamedQuery( name=“findCustomersByName”, queryString=“SELECT c FROM Customer c” +
“WHERE c.name LIKE :custName”)
@PersistenceContext public EntityManager entMngr;Query q = entMngr.createNamedQuery(“findCustomersByName”);q.setParameter(“custName”, “smith”);List customers = q.getResultList();
GlassFish:GlassFish:Sun Java System App ServerSun Java System App Serverс поддержкой с поддержкой Java EE 5 (EJB 3.0 Persistence) Java EE 5 (EJB 3.0 Persistence)
47
Проект GlassFish
• Поддерживает Java EE 5> EJB 3.0 persistence
• Разрабатывается как проект с открытым исходным кодом
48
Проект GlassFish – как это работает?
• Приветствуется любое участие!• Загрузите из CVS• Сконфигурируйте и постройте • Используйте NetBeans
> Для создания Java EE приложений> Для работы с GlassFish
Заключение,Заключение,Ресурсы,Ресурсы,Sun Developer NetworkSun Developer Network
50
• Упрощает модель persistence
• Поддерживается как в J2SE, так и в J2EE средах
• Расширенные возможности запросов, наследование, полиморфизм и многое другое
EJB 3.0 Persistence
51
Где найти информацию?
• Домашняя страница Glassfish> https://glassfish.dev.java.net/
• Java EE в SDN> http://java.sun.com/javaee/5/docs/
• Sun Developers Network> http://developers.sun.com/
52
Технические статьи
Sun Developer Network
http://developer.sun.com
Все что нужно для эффективной работы:
Множество примеров
Форумы
Видео, презентации,
и многое другое...
.
53
Постоянство в Постоянство в Java SE и Java EEJava SE и Java EE
на базе на базеEJB 3.0 PersistenceEJB 3.0 Persistence
Mikhail KondratyevMikhail [email protected]@sun.com
Sun Microsystems, Inc.Sun Microsystems, Inc.