Изучаем Java EE 7 - [90]
Contains. Сущности либо управляются менеджером сущностей, либо нет. Метод EntityManager.contains() возвращает логическое значение и позволяет вам проверить, находится ли экземпляр определенной сущности в настоящее время под управлением менеджера в контексте постоянства. В варианте тестирования, приведенном в листинге 6.13, показано, что обеспечивается постоянство Customer, и вы можете незамедлительно проверить, находится ли эта сущность под управлением (em.contains(customer)). Ответ в данном случае звучит как «да». Далее происходит вызов метода remove() и сущность удаляется из базы данных, а также из контекста постоянства (em.contains(customer) возвращает false).
>Customer customer = new Customer("Энтони", "Балла", "[email protected]");
>tx.begin();
>em.persist(customer);
>tx.commit();
>assertTrue(em.contains(customer));
>tx.begin();
>em.remove(customer);
>tx.commit();
>assertFalse(em.contains(customer));
Очистка и отсоединение. Метод clear() прост: он очищает контекст постоянства, приводя к тому, что все сущности, которые находятся под управлением, оказываются отсоединенными. Метод detach(Object entity) убирает определенную сущность из контекста постоянства. После такого «выселения», изменения, внесенные в эту сущность, не будут синхронизированы с базой данных. Код, приведенный в листинге 6.14, создает сущность, проверяет, находится ли она под управлением, отсоединяет ее от контекста постоянства, а также проверяет, была ли она отсоединена.
>Customer customer = new Customer("Энтони", "Балла", "[email protected]");
>tx.begin();
>em.persist(customer);
>tx.commit();
>assertTrue(em.contains(customer));
>em.detach(customer);
>assertFalse(em.contains(customer));
Отсоединенная сущность больше не ассоциирована с контекстом постоянства. Если вы хотите управлять ею, то вам потребуется снова присоединить эту сущность (то есть обеспечить ее слияние). Обратимся к примеру сущности, которую необходимо вывести на JSF-странице. Сущность, сначала загружаемая из базы данных на постоянный уровень (находящаяся под управлением), возвращается из вызова локального EJB-компонента (она является отсоединенной, поскольку контекст транзакции перестает существовать), выводится на уровне представления (все еще являясь отсоединенной), а затем возвращается для обновления в базу данных. Однако в тот момент сущность является отсоединенной, и необходимо присоединить ее снова или обеспечить слияние, чтобы синхронизировать ее состояние с базой данных.
Эта ситуация симулируется в листинге 6.15 путем очистки контекста постоянства (em.clear()), что приводит к отсоединению сущности.
>Customer customer = new Customer("Энтони", "Балла", "[email protected]");
>tx.begin();
>em.persist(customer);
>tx.commit();
>em.clear();
>// Задает новое значение для отсоединенной сущности
>customer.setFirstName("Уильям");
>tx.begin();
>em.merge(customer);
>tx.commit();
Код, приведенный в листинге 6.15, создает и обеспечивает постоянство Customer. Вызов em.clear() форсирует отсоединение сущности Customer, однако отсоединенные сущности продолжают присутствовать, но уже вне контекста постоянства, в котором они находились, а синхронизация их состояния с состоянием базы данных больше не обеспечивается. Именно это происходит при использовании customer.setFirstName("William"). Код выполняется в отношении отсоединенной сущности, и данные не обновляются в базе данных. Для репликации этого изменения в базу данных вам потребуется снова присоединить сущность (то есть обеспечить ее слияние) с помощью em.merge(customer) в рамках транзакции.
Обновление сущности является простой операцией, но в то же время может оказаться сложной для понимания. Как вы только что видели, EntityManager.merge() можно использовать для присоединения сущности и синхронизации ее состояния с базой данных. Однако если сущность находится в данный момент под управлением, внесенные в нее изменения не будут автоматически отражены в базе данных. В противном случае вам потребуется явным образом вызвать merge().
В листинге 6.16 демонстрируется обеспечение постоянства Customer с setFirstName, для которого задано значение Antony. Когда вы вызываете метод em.persist(), сущность находится под управлением, поэтому любые изменения, внесенные в эту сущность, будут синхронизированы с базой данных. Когда вы вызываете метод setFirstName(), состояние сущности изменяется. Менеджер сущностей кэширует все действия, начиная с tx.begin(), и обеспечивает соответствующую синхронизацию при фиксации.
>Customer customer = new Customer("Энтони", "Балла", "[email protected]");
>tx.begin();
>em.persist(customer);
>customer.setFirstName("Уильям");
>tx.commit();
По умолчанию любая операция выполняется менеджером сущностей только в отношении сущности, которая предусмотрена в качестве аргумента при этой операции. Но порой, когда операция выполняется в отношении сущности, возникает необходимость распространить ее на соответствующие ассоциации. Это называется
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.