PersistenceEJB3.0 Mikhail Moscow

53
1 Постоянство в Постоянство в Java SE и Java EE Java SE и Java EE на базе на базе EJB 3.0 Persistence EJB 3.0 Persistence Mikhail Kondratyev Mikhail Kondratyev [email protected] [email protected] Sun Microsystems, Inc. Sun Microsystems, Inc.

Transcript of PersistenceEJB3.0 Mikhail Moscow

Page 1: PersistenceEJB3.0 Mikhail Moscow

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.

Page 2: PersistenceEJB3.0 Mikhail Moscow

2

Содержание

• Требования к EJB 3.0 Persistence • Программная модель EJB 3.0 Persistence• Entity, их жизненный цикл и управление им• Entity Listeners• Отсоединенные Entity• O/R Mapping• Отношения между Entity • Запросы• GlassFish

Page 3: PersistenceEJB3.0 Mikhail Moscow

Требования к EJB 3.0 Требования к EJB 3.0 PersistencePersistence

Page 4: PersistenceEJB3.0 Mikhail Moscow

4

Требования к EJB 3.0 Persistence

• Упрощение модели постоянства• Облегченная модель

> В терминах программирования, развертывания и выполнения

• Моделирование домена через наследование и полиморфизм

• Object/Relational (O/R) mapping • Исчерпывающие возможности запросов

Page 5: PersistenceEJB3.0 Mikhail Moscow

5

Общая модель постоянства для Java:JSE и JEE

• EJB 3.0 Persistence может использоваться вне JEE• Эволюция в 'общую' технологию Java persistence

> Обобщение опыта Hibernate, JDO, TopLink, EJB разработчиков

> API на основе всех этих источников

• Поддержка сторонних реализаций модели постоянства

Page 6: PersistenceEJB3.0 Mikhail Moscow

Программная МодельПрограммная МодельEJB 3.0 PersistenceEJB 3.0 Persistence

Page 7: PersistenceEJB3.0 Mikhail Moscow

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

}

Page 8: PersistenceEJB3.0 Mikhail Moscow

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 объявляет первичный ключ

Page 9: PersistenceEJB3.0 Mikhail Moscow

9

Пример Entity класса (продолжение)...

// Отношение между Customer и Order @OneToManypublic Collection<Order> getOrders() { return orders;}

public void setOrders(Collection<Order> orders) { this.orders = orders;}

// Прочие бизнес методы...

}

Page 10: PersistenceEJB3.0 Mikhail Moscow

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); }

// прочие бизнес методы}

Page 11: PersistenceEJB3.0 Mikhail Moscow

Жизненный цикл Жизненный цикл EntityEntity

Page 12: PersistenceEJB3.0 Mikhail Moscow

12

Жизненный цикл Entity

Page 13: PersistenceEJB3.0 Mikhail Moscow

Класс EntityManagerКласс EntityManager

Page 14: PersistenceEJB3.0 Mikhail Moscow

14

EntityManager

• Управление жизненным циклом объектов > persist() - сохранение entity в базу данных> remove() - удаление entity из базы данных> merge() - синхронизовать состояние отсоединенных entity

Page 15: PersistenceEJB3.0 Mikhail Moscow

15

Операция persist

public Order createNewOrder(Customer customer) {Order order = new Order(customer);

// Превращает новые объекты в управляемые // При следующем вызове flush или завершении // транзакции данные будут вставлены в базу

entityManager.persist(order);

return order;}

Page 16: PersistenceEJB3.0 Mikhail Moscow

16

Операции поиска и удаления

public void removeOrder(Long orderId) {Order order =

entityManager.find(Order.class, orderId);

// Объект будет удален из базы при следующем вызове flush или завершении транзакцииentityManager.remove(order);

}

Page 17: PersistenceEJB3.0 Mikhail Moscow

17

Операция merge

public OrderLine updateOrderLine(OrderLine orderLine) { // Метод merge возвращает управляемую копию // отсоединенного объекта.

return entityManager.merge(orderLine);}

Page 18: PersistenceEJB3.0 Mikhail Moscow

18

Отсоединенные Entity

• Должны реализовывать Serializable для пересылки между удаленными машинами

• Операция merge может выполняться каскадно

Page 19: PersistenceEJB3.0 Mikhail Moscow

Обработчики событийОбработчики событий

Page 20: PersistenceEJB3.0 Mikhail Moscow

20

Обработчики событий

• Обработчики и callback методы предназначены для вызова persistence провайдером при различных событиях жизненного цикла

• Callback методы > Методы могут быть определены с помощью аннотаций в

тексте самого Entity или помещены в отдельный класс> Аннотации:

> PrePersist / PostPersist> PreRemove/ PostRemove> PreUpdate / PostUpdate> PostLoad

Page 21: PersistenceEJB3.0 Mikhail Moscow

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 { ... }

}

Page 22: PersistenceEJB3.0 Mikhail Moscow

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());

}

Page 23: PersistenceEJB3.0 Mikhail Moscow

23

Entity Listeners: пример – 3

public class AlertMonitor {

@PostPersistpublic void newAccountAlert(Account acct) {

Alerts.sendMarketingInfo(acct.getAccountId(), acct.getBalance());

}}

Page 24: PersistenceEJB3.0 Mikhail Moscow

O/R MappingO/R Mapping

Page 25: PersistenceEJB3.0 Mikhail Moscow

25

O/R Mapping

• Множество аннотаций для описания> Отношений> Joins> Используемых таблиц и колонок> Генераторов последовательностей> И многого другого

• O/R mapping может задаваться как в тексте самого класса, так и в специальном файле

Page 26: PersistenceEJB3.0 Mikhail Moscow

26

Простая привязка к базе данных

CUSTOMER

ID NAME C_RATING PHOTO

@Entity

@Id

@Lob

public class Customer {

int id;

String name;

int c_rating;

Image photo;}

Page 27: PersistenceEJB3.0 Mikhail Moscow

27

public class Customer {

int id;

String name;

int c_rating;

Image photo;}

Простая привязка к базе данных

@Entity

@Column(name=“CREDIT”)

@Id

@Lob

CUSTOMER

ID NAME CREDIT PHOTO

Page 28: PersistenceEJB3.0 Mikhail Moscow

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; }

Page 29: PersistenceEJB3.0 Mikhail Moscow

Entity и отношенияEntity и отношения

Page 30: PersistenceEJB3.0 Mikhail Moscow

30

Отношения

• Моделируют связи между entity• Поддерживаются однонаправленные и

двунаправленные отношения> Однонаправленное отношение: Entity A ссылается на B, но

B не ссылается на A

• Варианты отношений> Один к одному> Один ко многим> Многие к одному> Многие ко многим

Page 31: PersistenceEJB3.0 Mikhail Moscow

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;

}...}

Page 32: PersistenceEJB3.0 Mikhail Moscow

32

Каскадное поведение

• Необходимо для распространения операции на связанные сущности

• Cascade=PERSIST• Cascade=REMOVE• Cascade=MERGE• Cascade=REFRESH• Cascade=ALL

Page 33: PersistenceEJB3.0 Mikhail Moscow

Поддержка Поддержка наследованиянаследования

Page 34: PersistenceEJB3.0 Mikhail Moscow

34

НаследованиеПривязка классов к таблицам

• Использование аннотаций• Поддержка разичных стратегий наследования

> Единая таблица> Все классы иерархии связываются с одной таблицей> В таблице описывается специальное поле для указания класса

> Отдельная таблица для каждого класса > Каждый класс привязывается к отдельной таблице, содержащей все

необходимыe данные> Присоединенные таблицы подклассов

> Корневой класс иерархии представляется одной таблицей> Каждый подкласс представляется одной таблицей, содержащей

специфичные для него данные

Page 35: PersistenceEJB3.0 Mikhail Moscow

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{...}

Page 36: PersistenceEJB3.0 Mikhail Moscow

Первичные ключи Первичные ключи

Page 37: PersistenceEJB3.0 Mikhail Moscow

37

Первичные ключи и идентификация Entity• И простые, и композитные ключи должны быть

сериализуемы• Поддержка композитных ключей

> Должен быть определен класс, представляющий первичный ключ

> В качестве класса первичного ключа могут использоваться встроенные классы

> Композитный ключ привязывается к полю/полям Entity

Page 38: PersistenceEJB3.0 Mikhail Moscow

38

Встраиваемые объекты

• @Embeddable используется для указания встраиваемого объекта

• Встраиваемый объект сохраняется как внутренняя часть внешнего объекта> Использует идентификатор родительского объекта, своего

идентификатора не имеет

Page 39: PersistenceEJB3.0 Mikhail Moscow

39

Встраиваемые объекты - пример

@Embeddable(access=FIELD)public class EmploymentPeriod {

java.util.Date startDate;java.util.Date endDate;

}

@Embeddedpublic EmploymentPeriod getEmploymentPeriod() { ... }

Page 40: PersistenceEJB3.0 Mikhail Moscow

ЗапросыЗапросы

Page 41: PersistenceEJB3.0 Mikhail Moscow

41

Улучшения в EJB-QL

• Множественные удаления и обновления• Group By / Having• Подзапросы• Дополнительные функции SQL функции

> UPPER, LOWER, TRIM, CURRENT_DATE, ...• Полиморфные запросы• Именованные и динамические запросы

Page 42: PersistenceEJB3.0 Mikhail Moscow

42

Полиморфные запросы

• Все запросы по умолчанию полиморфны> Это означает что FROM часть описывает не только

объекты конкретного класса, но и всех его подклассов

select avg(e.salary) from Employee e where e.salary > 80000

Page 43: PersistenceEJB3.0 Mikhail Moscow

43

Joins

• Поддержка> Inner Joins> Left Joins> Fetch join

SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.orders WHERE c.address.state = 'MA'

Page 44: PersistenceEJB3.0 Mikhail Moscow

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();}

Page 45: PersistenceEJB3.0 Mikhail Moscow

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();

Page 46: PersistenceEJB3.0 Mikhail Moscow

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)

Page 47: PersistenceEJB3.0 Mikhail Moscow

47

Проект GlassFish

• Поддерживает Java EE 5> EJB 3.0 persistence

• Разрабатывается как проект с открытым исходным кодом

Page 48: PersistenceEJB3.0 Mikhail Moscow

48

Проект GlassFish – как это работает?

• Приветствуется любое участие!• Загрузите из CVS• Сконфигурируйте и постройте • Используйте NetBeans

> Для создания Java EE приложений> Для работы с GlassFish

Page 49: PersistenceEJB3.0 Mikhail Moscow

Заключение,Заключение,Ресурсы,Ресурсы,Sun Developer NetworkSun Developer Network

Page 50: PersistenceEJB3.0 Mikhail Moscow

50

• Упрощает модель persistence

• Поддерживается как в J2SE, так и в J2EE средах

• Расширенные возможности запросов, наследование, полиморфизм и многое другое

EJB 3.0 Persistence

Page 51: PersistenceEJB3.0 Mikhail Moscow

51

Где найти информацию?

• Домашняя страница Glassfish> https://glassfish.dev.java.net/

• Java EE в SDN> http://java.sun.com/javaee/5/docs/

• Sun Developers Network> http://developers.sun.com/

Page 52: PersistenceEJB3.0 Mikhail Moscow

52

Технические статьи

Sun Developer Network

http://developer.sun.com

Все что нужно для эффективной работы:

Множество примеров

Форумы

Видео, презентации,

и многое другое...

.

Page 53: PersistenceEJB3.0 Mikhail Moscow

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.