Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java_sp.doc
Скачиваний:
26
Добавлен:
29.10.2018
Размер:
1.12 Mб
Скачать

16. Объектно-реляционное отображение. Жизненный цикл персистентных объектов (entity lifecycle)

EntityManager

• Управляет жизненным циклом Entity объектов

> persist() - помещает объект в БД

> remove() - удаляет объект из БД

> merge() - синхронизирует с БД состояние отсоединенного объекта

> refresh() - обновляет из БД состояние объекта

Persist

public Order createNewOrder(Customer customer) {

// Создаем новый объект

Order order = new Order(customer);

// После вызова метода persist() объект меняет свой

// статус на управляемый. Во время очередной

// операции записи в БД обект будет помещен в БД.

entityManager.persist(order);

return order;

}

Find и Remove

public void removeOrder(Long orderId) {

Order order =

entityManager.find(Order.class, orderId);

// Объект будет удален из БД при очередной

// операции записи в БД. Доступ к удаленному

// объекту приводит к непредсказуемым

// результатам.

entityManager.remove(order);

}

Merge

public OrderLine updateOrderLine(OrderLine orderLine) {

// Метод merge возвращает управляемую копию

// переданного отсодиненного объекта. Если состояние

// отсоединного объекта было изменено, то изменения

// будут отражены в возвращаемой копии.

return entityManager.merge(orderLine);

}

Жизненный цикл Entity

17. Объектно-реляционное отображение. Интерфейс EntityManager.

Интерфейс Entity Manager используется для взаимодействия с persistence context.

Entity Manager обладает возможностями:

  • Записывать объекты в хранилище

  • Сохранять как простые, так и композитные (вложенные) объекты

  • Получать объекты из хранилища по имени класса или идентификатору объекта

  • Синхронизируется с модулем поиска

  • Хранит историю изменений

  • Хранит связи между объектами

Естественно, существуют аналогичные модулю Entity Manager разработки, наиболее известной свободно-распространяемой из которых является библиотека Hibernate

Плюсы

  • Модуль EM представляет собой web-сервис, что предаёт ему автономность и возможность использования несколькими клиентами одновременно

  • Более лёгкая настройка при подготовке к работе по сравнению с Hibernate

  • Основное отличие, более высокая скорость работы

Минусы

  • В EM при подключении к базе данных нет возможности управлять форматом сохранения, нельзя напрямую работать с базой данных

  • Hibernate поддерживает больше типов коллекций (Map, Set и т. д.), в EM реализована поддержка только типа List

Следующий пример показывает, как создать менеджер сущностей и как сохранить сущность Book: EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU"); EntityManager em = emf.createEntityManager(); em.persist(book);

18. Объектно-реляционное отображение. Создание запросов на jpql, sql

Подобно JDBC, технология JPA позволяет нам выполнять запросы к БД с использованием

языков запросов SQL и JPQL (Java Persistence Query Language).

Методы интерфейса EntityManager, предназначенные для создания запросов.

Query createQuery(String jpaQuery) Создает запрос к БД на языке JPQL.

Query createNativeQuery(String sqlQuery) Создает SQL-запрос в диалекте, специфичном для

конкретной СУБД.

Query createNamedQuery(String queryName) Создает именованный запрос.

По своим синтаксическим конструкциям JPQL очень похож на SQL. Однако, если SQL предназначен для работы с реляционной моделью данных, то в JPQL вся работа производится с Java-объектами.

JPQL обладает одним важнейшим свойством — переносимостью. Как известно, имеющиеся СУБД используют различные диалекты SQL, в общем случае несовместимые между собой. Синтаксис JPQL не привязан к диалекту SQL какой-либо СУБД. Все методы возвращают объект класса JPA-провайдера, реализующего интерфейс javax.persistence.Query, который является объектным представлением запроса к БД. Query похож на java.sql.Statement в JDBC и предназначен для контроля выполнения запроса и получения результатов.

Пример:

private Customer findCustomerByPhoneNumber(String phoneNumber) {

Customer customer = null;

String queryStr = "SELECT OBJECT(c) "

+ "FROM Customer AS c, IN(c.phones) p "

+ "WHERE p.phoneNumber = :phoneNumber";

Query query = manager.createQuery(queryStr);

query.setParameter("phoneNumber", phoneNumber);

EntityTransaction t = null;

try {

t = manager.getTransaction();

t.begin();

customer = (Customer) query.getSingleResult();

t.commit();

} catch (Exception e) {

// Откат транзакции и обработка возникшего исключения

...

}

return customer;

}

Результатом выполнения нашего запроса является единственное значение, поэтому для

получения объекта класса Customer мы используем метод getSingleResult. Если

результатом запроса будет набор значений, метод getSingleResult сгенерирует

исключение javax.persistence.NonUniqueResultException. В случае, если не будет

выбрано ни одной строки, метод сгенерирует javax.persistence.NoResultException.

Для получения списка объектов следует вызвать метод getResultList.

SQL запросы преставляются через тот же Query интерфейс, который используется для JPQL запросов. Единствоенное различие заключается в том, что для SQL используется метод Session.createSQLQuery().

Query sqlQuery = sess.createSQLQuery("select * from cats ", Cat);

sqlQuery.setMaxResults(50);

List cats = sqlQuery.list();

Три параметра используемые при вызове createSQLQuery():

  • строка SQL запроса

  • возвращаемый запросом персистентный класс

Именованные SQL запросы могут быть определены в документе маппинга и вызваны в точности так же, как это осуществляется для HQL запросов.

List people = sess.getNamedQuery("mySqlQuery")

.setMaxResults(50)

.list();

<sql-query name="mySqlQuery">

<return alias="person" class="eg.Person"/>

SELECT {person}.NAME AS {person.name},

{person}.AGE AS {person.age},

{person}.SEX AS {person.sex}

FROM PERSON {person} WHERE {person}.NAME LIKE 'Hiber%'

</sql-query>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]