Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

pdf / 3-jpa

.pdf
Скачиваний:
23
Добавлен:
06.06.2015
Размер:
170.47 Кб
Скачать

@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)

Соседние файлы в папке pdf