Изучаем Java EE 7 - [84]

Шрифт
Интервал

Из этой главы вы узнаете, как управлять постоянными объектами. Это означает, что вы научитесь проводить операции создания, чтения, обновления и удаления (CRUD) с помощью менеджера сущностей, а также выполнять комплексные запросы с использованием JPQL. В этой главе также рассказывается о том, как JPA справляется с конкурентным доступом и работает с кэшем второго уровня. Она заканчивается объяснением жизненного цикла сущности и того, как JPA позволяет вам добавлять собственную бизнес-логику, когда в случае с сущностью имеют место определенные события.

Менеджер сущностей

Менеджер сущностей — центральный элемент JPA. Он управляет состоянием и жизненным циклом сущностей, а также позволяет выполнять запросы к сущностям в контексте постоянства. Менеджер сущностей отвечает за создание и удаление экземпляров постоянных сущностей и поиск сущностей по их первичному ключу. Он может блокировать сущности для защиты от конкурентного доступа, используя оптимистическую или пессимистическую блокировку, а также способен задействовать JPQL-запросы для извлечения сущностей согласно определенным критериям.

Когда менеджер сущностей получает ссылку на сущность, считается, что он управляет ею. До этого момента сущность рассматривается как обычный POJO-объект (то есть отсоединенный). Мощь JPA заключается в том, что сущности могут использоваться как обычные объекты на разных уровнях приложения и стать управляемыми менеджером сущностей, когда вам необходимо загрузить или вставить информацию в базу данных. Когда сущность находится под управлением, вы можете проводить операции, направленные на обеспечение постоянства, а менеджер сущностей будет автоматически синхронизировать состояние сущности с базой данных. Когда сущность оказывается отсоединенной (то есть не находится под управлением), она снова становится простым Java-объектом, который затем может быть использован на других уровнях (например, JavaServer Faces или JSF на уровне представления) без синхронизации его состояния с базой данных.

Что касается постоянства, то реальная работа здесь начинается с помощью менеджера сущностей. Он является интерфейсом, реализуемым поставщиком постоянства, который будет генерировать и выполнять SQL-операторы. Интерфейс javax.persistence.EntityManager представляет собой API-интерфейс для манипулирования сущностями (соответствующее подмножество приведено в листинге 6.1).


Листинг 6.1. Подмножество API-интерфейса EntityManager

>public interface EntityManager {


>··// EntityManagerFactory для создания EntityManager,

>··// его закрытия и проверки того, открыт ли он

>··EntityManagerFactory getEntityManagerFactory();

>··void close();

>··boolean isOpen();


>··// Возвращает EntityTransaction

>··EntityTransaction getTransaction();


>··// Обеспечивает постоянство, слияние сущности в базе данных,

>··// а также ее удаление оттуда

>··void persist(Object entity);

>·· T merge(T entity);

>··void remove(Object entity);


>··// Обеспечивает поиск сущности на основе ее первичного ключа

>··// (с разными механизмами блокировки)

>·· T find(Class entityClass, Object primaryKey);

>·· T find(Class entityClass, Object primaryKey, LockModeType lockMode);

>·· T getReference(Class entityClass, Object primaryKey);


>··// Блокирует сущность, применяя указанный тип режима блокировки

>··// (оптимистическая, пессимистическая…)

>··void lock(Object entity, LockModeType lockMode);


>··// Синхронизирует контекст постоянства с основной базой данных

>··void flush();

>··void setFlushMode(FlushModeType flushMode);

>··FlushModeType getFlushMode();


>··// Обновляет состояние сущности из базы данных,

>··// перезаписывая любые внесенные изменения

>··void refresh(Object entity);

>··void refresh(Object entity, LockModeType lockMode);


>··// Очищает контекст постоянства, а также проверяет, содержит ли он сущность

>··void clear();

>··void detach(Object entity);

>··boolean contains(Object entity);


>··// Задает и извлекает значение свойства EntityManager или подсказку

>··void setProperty(String propertyName, Object value);

>··Map getProperties();


>··// Создает экземпляр Query или TypedQuery для выполнения JPQL-оператора

>··Query createQuery(String qlString);

>·· TypedQuery createQuery(CriteriaQuery criteriaQuery);

>·· TypedQuery createQuery(String qlString, Class resultClass);


>··// Создает экземпляр Query или TypedQuery для выполнения именованного запроса

>··Query createNamedQuery(String name);

>·· TypedQuery createNamedQuery(String name, Class resultClass);


>··// Создает экземпляр TypedQuery для выполнения «родного» SQL-запроса

>··Query createNativeQuery(String sqlString);

>··Query createNativeQuery(String sqlString, Class resultClass);

>··Query createNativeQuery(String sqlString, String resultSetMapping);


>··// Создает StoredProcedureQuery для выполнения хранимой процедуры в базе данных

>··StoredProcedureQuery createStoredProcedureQuery(String procedureName);

>··StoredProcedureQuery createNamedStoredProcedureQuery(String name);


>··// Metamodel и CriteriaBuilder для запросов с использованием критериев

>··// (выборка, обновление и удаление)

>··CriteriaBuilder getCriteriaBuilder();


Рекомендуем почитать
Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.