Изучаем Java EE 7 - [85]
>··Metamodel getMetamodel();
>··Query createQuery(CriteriaUpdate updateQuery);
>··Query createQuery(CriteriaDelete deleteQuery);
>··// Указывает на то, что JTA-транзакция активна,
>··// и соединяет с ней контекст постоянства
>··void joinTransaction();
>··boolean isJoinedToTransaction();
>··// Возвращает объект базового поставщика для EntityManager
>··
>··Object getDelegate();
>··// Возвращает EntityGraph
>··
>··EntityGraph> createEntityGraph(String graphName);
>··
>··
>}
Не стоит пугаться API-интерфейса из листинга 6.1, поскольку в этой главе рассматривается большинство соответствующих методов. В следующем разделе я объясню, как получить экземпляр EntityManager.
Получение менеджера сущностей
Менеджер сущностей — центральный интерфейс, используемый для взаимодействия с сущностями, однако приложению нужно сначала получить его. В зависимости от того, является ли среда управляемой контейнером (как вы увидите в главе 7 при работе с EJB-компонентами) или же управляемой приложением, код может быть совершенно другим. Например, в среде, управляемой контейнером, транзакциями управляет контейнер. Это означает, что вам не потребуется явным образом указывать commit или rollback, что вам пришлось бы сделать в среде, управляемой приложением.
Словосочетание «управляемая приложением» означает, что приложение отвечает за явное получение экземпляра EntityManager и управление его жизненным циклом (например, оно закрывает менеджер сущностей по окончании работы). В коде, приведенном в листинге 6.2, показано, как класс, функционирующий в среде Java SE, получает экземпляр менеджера сущностей. Он задействует класс Persistence для начальной загрузки экземпляра EntityManagerFactory, который ассоциирован с единицей сохраняемости (chapter06PU), используемой затем для создания EntityManager. Следует отметить, что в среде, управляемой приложением, за создание и закрытие менеджера сущностей (то есть за управление его жизненным циклом) отвечает разработчик.
>public class Main {
>··public static void main(String[] args) {
>····// Создает экземпляр Book
>····Book book = new Book ("H2G2", "Автостопом по Галактике",
>····12.5F, "1-84023-742-2", 354, false);
>····// Получает менеджер сущностей и транзакцию
>····EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter06PU");
>····EntityManager em = emf.createEntityManager();
>····// Обеспечивает постоянство Book в базе данных
>····EntityTransaction tx = em.getTransaction();
>····tx.begin();
>····em.persist(book);
>····tx.commit();
>····// Закрывает менеджер сущностей и фабрику
>····em.close();
>····emf.close();
>··}
>}
Создание управляемого приложением менеджера сущностей осуществляется довольно просто с помощью фабрики, однако управляемую приложением среду отличает от управляемой контейнером среды то, каким образом происходит получение EntityManagerFactory. Среда, управляемая контейнером, имеет место, когда приложение эволюционирует в сервлет или EJB-контейнер. В среде Java EE самый распространенный способ получения менеджера сущностей заключается в использовании аннотации @PersistenceContext или в JNDI-поиске. Компоненту, работающему в контейнере (это может быть сервлет, EJB-компонент, веб-служба и т. д.), не нужно создавать или закрывать EntityManager, поскольку его жизненный цикл управляется контейнером. В листинге 6.3 показан код сессионного EJB-компонента без сохранения состояния, в который мы внедряем ссылку на единицу сохраняемости chapter06PU.
>@Stateless
>public class BookEJB {
>··@PersistenceContext(unitName = "chapter06PU")
>··private EntityManager em;
>··public void createBook() {
>····// Создает экземпляр Book
>····Book book = new Book("H2G2", "Автостопом по Галактике",
>····12.5F, "1-84023-742-2", 354, false);
>····// Обеспечивает постоянство Book в базе данных
>····em.persist(book);
>··}
>}
По сравнению с кодом из листинга 6.2 код, приведенный в листинге 6.3, намного проще. Во-первых, в нем нет Persistence или EntityManagerFactory, поскольку контейнер внедряет экземпляр EntityManager. Приложение не отвечает за управление жизненным циклом менеджера сущностей (создание или закрытие). Во-вторых, поскольку EJB-компоненты без сохранения состояния управляют транзакциями, в этом коде не указан явным образом параметр commit или rollback. Такой стиль EntityManager демонстрируется в главе 7.
Если вы заглянете в подраздел «Производители данных» главы 2, то поймете, что также можете использовать @Inject в сочетании с EntityManager, если будете генерировать его (с применением аннотации @Produces).
Контекст постоянства
Перед тем как подробно исследовать API-интерфейс менеджера сущностей, вам необходимо понять крайне важную концепцию: контекст постоянства. Это набор экземпляров сущностей, находящихся под управлением. Он наблюдается в определенный момент времени для транзакции определенного пользователя: в контексте постоянства может существовать только один экземпляр сущности с одним и тем же постоянным идентификатором. Например, если экземпляр Book с идентификатором 12 существует в контексте постоянства, то никакой другой экземпляр 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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.