Изучаем 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();


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


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

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


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

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


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

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