Изучаем Java EE 7 - [53]
JPA нацелен на реляционные базы данных. Метаданные отображения (аннотации или XML) предназначены для отображения сущностей в структурированные таблицы, а атрибутов — в столбцы. Благодаря разным структурам хранения данных началась новая эра баз данных NoSQL (Not Only SQL — «Не только SQL») (или бессхемных баз данных): ключ/значение, столбец, документ или граф. В настоящее время JPA не позволяет отображать сущности в эти структуры. Hibernate OGM — фреймворк с открытым исходным кодом, который пытается решить этот вопрос. У EclipseLink тоже имеется несколько расширений для отображения NoSQL-структур. Рассмотрение Hibernate OGM и EclipseLink-расширений выходит за рамки этой книги, однако вам следует взглянуть на них, если вы планируете использовать базы данных NoSQL.
Выполнение запросов к сущностям
JPA позволяет вам отображать сущности в базах данных, а также выполнять к ним запросы с использованием разных критериев. Мощь JPA заключается в том, что он дает возможность выполнять запросы к сущностям объектно-ориентированным путем без необходимости применения внешних ключей или столбцов, относящихся к основной базе данных. Центральным элементом API-интерфейса, отвечающего за оркестровку сущностей, является javax.persistence.EntityManager. Его роль состоит в управлении сущностями, их чтении и записи в определенную базу данных наряду с обеспечением возможности проведения простых операций CRUD (create, read, update, delete — «создание», «чтение», «обновление», «удаление»), а также комплексных запросов с применением JPQL. С технической точки зрения EntityManager представляет собой всего лишь интерфейс, реализация которого обеспечивается поставщиком постоянства (например, EclipseLink). В приведенном далее фрагменте кода показано, как получить EntityManager и обеспечить постоянство сущности Book:
>EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter04PU");
>EntityManager em = emf.createEntityManager();
>em.persist(book);
На рис. 4.2 продемонстрировано, как интерфейс менеджера сущностей может быть использован классом (который здесь имеет имя Main) для манипулирования сущностями (в данном случае Book). С помощью таких методов, как persist() и find(), EntityManager скрывает JDBC-вызовы базы данных и оператор SQL (Structured Query Language — язык структурированных запросов) INSERT или SELECT.
Рис. 4.2. Менеджер сущностей взаимодействует с сущностью и основной базой данных
Менеджер сущностей также позволяет вам выполнять запросы к сущностям. Запрос в данном случае аналогичен запросу к базе данных за исключением того, что вместо использования SQL интерфейс JPA выполняет запросы к сущностям с применением JPQL. В его синтаксисе используется привычная точечная (.) нотация объектов. Для извлечения информации обо всех книгах, в названии которых присутствует H2G2, вы можете написать следующее:
>SELECT b FROM Book b WHERE b.title = 'H2G2'
Следует отметить, что title является именем атрибута Book, а не именем столбца таблицы. JPQL-операторы манипулируют объектами и атрибутами, а не таблицами и столбцами. JPQL-оператор может выполняться с использованием динамических (генерируемых динамически во время выполнения) или статических (определяемых статически во время компиляции) запросов. Вы также можете выполнять «родные» SQL-операторы и даже хранимые процедуры. Статические запросы, также известные как именованные, определяются с использованием либо аннотаций (@NamedQuery), либо XML-метаданных. Приведенный ранее JPQL-оператор может, к примеру, быть определен как именованный запрос в отношении сущности Book. В листинге 4.3 показана сущность Book с определением именованного запроса findBookH2G2 с помощью аннотации @NamedQuery (более подробно о запросах мы поговорим в главе 6).
>@Entity
>@NamedQuery(name = "findBookH2G2",
>············query = "SELECT b FROM Book b WHERE b.title ='H2G2'")
>public class Book {
>··@Id @GeneratedValue
>··private Long id;
>··private String title;
>··private Float price;
>··private String description;
>··private String isbn;
>··private Integer nbOfPage;
>··private Boolean illustrations;
>// Конструкторы, геттеры, сеттеры
>}
EntityManager можно получить в стандартном Java-классе с использованием фабрики. В листинге 4.4 показан такой класс, который создает сущность Book, обеспечивает ее постоянство в таблице и выполняет именованный запрос. Соответствующие действия он предпринимает с этапа 1 по 5.
1. Создает экземпляр сущности Book. Сущности являются аннотированными POJO, управляемыми поставщиком постоянства. С точки зрения Java экземпляр класса, как и любой POJO, необходимо создавать с помощью ключевого слова new. Важно подчеркнуть, что до этой точки в коде поставщик постоянства не осведомлен об объекте Book.
2. Получает EntityManager и транзакцию. Это важная часть кода, поскольку EntityManager необходим для манипулирования сущностями. Прежде всего создается EntityManagerFactory для единицы сохраняемости chapter04PU. После этого EntityManagerFactory задействуется для получения EntityManager (переменная em), используется повсюду в коде для получения транзакции (переменная tx) и обеспечения постоянства и извлечения Book.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.