··
}
Не стоит пугаться 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);
··}
}