pdf / 3-jpa
.pdf@Inheritance(strategy=Inheritan ceType.TABLE_PER_CLASS)
●Объекты каждого класса хранится в своей таблице
●Опциональна в текущей версии стандарта
●Плюсы
–Быстрая для многих операций
–Не нужна модификация существующих таблиц при добавление нового типа
●Недостатки
–Плохая поддержка полиморфизма
–Требует SELECT UNION или множества независимых запросов для полиморфного доступа
@Inheritance(strategy=Inheritan
ceType.JOINED)
●Базовый класс в иерархии представлен таблицей
●Каждый потомок хранит свои (не из базового класса) данные в отдельной таблице
●Первичный ключ для потомка является одновременно внешним ключом (ссылка на предка)
●В базовой таблице есть колонка @DiscriminatorColumn
●Плюсы
–Хорошая поддержка полиморфизма
–Нет необходимости менять таблицы при добавление нового класса
●Минусы
–Низкая производительность (падает при росте глубины иерархии)
Управление
●EntityManager
–Container-Managed Entity Managers @PersistenceContext EntityManager em;
–Application-Managed Entity Managers (EntityManagerFactory)
@PersistenceContext EntityManager em;
public void enterOrder(int custID, Order newOrder) { Customer cust = em.find(Customer.class, custID); cust.getOrders().add(newOrder); newOrder.setCustomer(cust);
}
Жизненный цикл
●New – еще не ассоциирована с persistence context и не имеет persistent identity
●Managed – ассоциирована с контекстом и имеет persistent identity
●Detached - не ассоциирована с persistence context но имеет persistent identity
–После завершения транзакции
–После сериализации/удаленного вызова
–Прочее
●Removed - ассоциирована с контекстом и имеет persistent identity, но запланирована
кудалению
New -> Managed
●Явный вызов метода em.persist или каскадное срабатывание при использование relationship с опциями cascade=PERSIST or cascade=ALL.
●Если была в состояние:
–Remove то становится Managed
–Detached то ошибка
–Managed то игнорируется, но выполняется если необходимо для relationship
LineItem li = new LineItem(order, product, quantity); order.getLineItems().add(li);
em.persist(li);
Удаление
●Прямой вызов метода Remove или каскадное срабатывание (cascade=REMOVE or cascade=ALL)
●Если вызвано для:
–New – игнорируется, но выполняется если необходимо для relationship
–Detached — ошибка (IllegalArgumentException или
ошибка при завершение)
– Remove - игнорируется
Order order = em.find(Order.class, orderId); em.remove(order);
Синхронизация с базой данных
●Завершается по commit
●Не подразумевает обновление Entities если не вызван явно refresh
●В случае bidirectional связей (reletionships) сохраняется со стороны владельца связи
●force() для принудительного сохранение в базу посреди транзакции.
Detached Entities
●Доступны свойства:
–Если они не помечены как fetch=LAZY
–Если до них доступались, когда Entity была Managed
●В случае коллекций доступны:
–Все что получено методом find
–Через FETCH JOIN
–Если был доступ к entity (кроме ID) в рамках контекста
–Ассоциация fetch=EAGER
Merge (Detached->Managed)
●Если есть manage X то в него копируется состояние detached X
●Если есть новый detached X то его состояние копируется в новый manage X
●Если Х удален то ошибка
●Если Х managed то игнорируется за исключением ассоциаций cascade=MERGE or cascade=ALL
●LAZY поля не копируются если они еще не инициализированы
Optimistic Locking and
Concurrency
●OptimisticLockException
●@Version для колонки с версий (обновляется контейнером)
●LockModeType (READ, WRITE)
●EnitityManager.lock(entity, LockModeType.xxxxx)– опционально для не версионных объектов (PersistenceException)