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

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

3. Обеспечивает постоянство Book в базе данных. Код начинает транзакцию (tx.begin()) и использует метод EntityManager.persist() для вставки экземпляра Book. После фиксации транзакции (tx.commit()) информация сбрасывается в базу данных.

4. Выполняет именованный запрос. Опять-таки EntityManager используется для извлечения Book посредством именованного запроса findBookH2G2.

5. Закрывает EntityManager и EntityManagerFactory.


Листинг 4.4. Класс Main, который обеспечивает постоянство и извлекает сущность Book

>public class Main {

>··public static void main(String[] args) {

>····// 1. Создает экземпляр Book

>····Book book = new Book("H2G2", "Автостопом по Галактике", 12.5F, 

>"1-84023-742-2", 354, false);

>····// 2. Получает EntityManager и транзакцию

>····EntityManagerFactory emf = 

>Persistence.createEntityManagerFactory("chapter04PU");

>····EntityManager em = emf.createEntityManager();

>····// 3. Обеспечивает постоянство Book в базе данных

>····EntityTransaction tx = em.getTransaction();

>····tx.begin();

>····em.persist(book);

>····tx.commit();

>····// 4. Выполняет именованный запрос

>····book = em.createNamedQuery("findBookH2G2", Book.class). getSingleResult();

>····// 5. Закрывает EntityManager и EntityManagerFactory

>····em.close();

>····emf.close();

>··}

>}

Обратите внимание на отсутствие SQL-запросов и JDBC-вызовов в листинге 4.4. Как показано на рис. 4.2, класс Main взаимодействует с основной базой данных с помощью интерфейса EntityManager, который обеспечивает набор стандартных методов, позволяющих вам осуществлять операции с сущностью Book. EntityManager «за кадром» полагается на поставщика постоянства для взаимодействия с базами данных. При вызове метода EntityManager поставщик постоянства генерирует и выполняет SQL-оператор с помощью соответствующего JDBC-драйвера.

Единица сохраняемости

Какой JDBC-драйвер вам следует использовать? Как вам нужно подключаться к базе данных? Каково имя базы данных? Эта информация отсутствует в приводившемся ранее коде. Когда класс Main (см. листинг 4.4) создает EntityManagerFactory, он передает имя единицы сохраняемости в качестве параметра; в данном случае она имеет имя chapter04PU. Единица сохраняемости позволяет EntityManager узнать тип базы данных для использования и параметры подключения, определенные в файле persistence.xml, который показан в листинге 4.5 и должен быть доступен по пути к соответствующему классу.


Листинг 4.5. Файл persistence.xml, определяющий единицу сохраняемости

>

>

>·············xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

>·············xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 

>·············http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"

>·············version="2.1">

>··

>····org.eclipse.persistence.jpa.PersistenceProvider

>····org.agoncal.book.javaee7.chapter04.Book

>····

>······

>value="drop-and-create"/>

>······

>······

>················value="org.apache.derby.jdbc.ClientDriver"/>

>······

>················value="jdbc: derby://localhost:1527/chapter04DB;create=true"/>

>······

>······

>····

>··

>

Единица сохраняемости chapter04PU определяет JDBC-подключение для базы данных Derby chapter04DB, которая функционирует на локальном хосте с помощью порта 1527. К ней подключается пользователь (APP) с применением пароля (APP) по заданному URL-адресу. Тег дает указание поставщику постоянства управлять классом Book (существуют и другие теги для неявного или явного обозначения классов с управляемым постоянством, например , или ). Без единицы сохраняемости сущностями можно манипулировать как POJO, однако их постоянство при этом обеспечиваться не будет.

Жизненный цикл сущности и обратные вызовы

Сущности представляют собой всего лишь POJO. Когда EntityManager управляет POJO, у них имеется идентификатор постоянства (ключ, который уникально идентифицирует экземпляр и является эквивалентом первичного ключа), а база данных синхронизирует их состояние. Когда управление ими не осуществляется (то есть они обособлены от EntityManager), их можно использовать как любой другой Java-класс. Это означает, что у сущностей имеется жизненный цикл (рис. 4.3). Когда вы создадите экземпляр сущности Book с помощью оператора new, объект будет располагаться в памяти, а JPA ничего не будет знать о нем (этот объект даже может перестать существовать в результате сборки мусора) Когда им начнет управлять EntityManager, таблица BOOK отобразит и синхронизирует его состояние. Вызов метода EntityManager.remove() приведет к удалению соответствующей информации из базы данных, однако Java-объект продолжит находиться в памяти, пока не исчезнет в результате сборки мусора.


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.