············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.
3. Обеспечивает постоянство Book в базе данных. Код начинает транзакцию (tx.begin()) и использует метод EntityManager.persist() для вставки экземпляра Book. После фиксации транзакции (tx.commit()) информация сбрасывается в базу данных.
4. Выполняет именованный запрос. Опять-таки EntityManager используется для извлечения Book посредством именованного запроса findBookH2G2.
5. Закрывает EntityManager и EntityManagerFactory.
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 и должен быть доступен по пути к соответствующему классу.