Статьи

Помимо Java ORM: что сделал Versant с JPA (часть 1)

Еще в 2004 году Sun Microsystems боролась с недостатками своих спецификаций Enterprise Java Beans (EJB) 2.0 и EJB 2.1. В то время было ясно, что для упрощения жизни разработчиков Java необходимо упростить архитектуру, усовершенствования стандартизации и постоянства.

Таким образом, спецификация Java Persistence API 1.0 родилась в 2006 году как часть EJB 3.0 (JSR-220) с дальнейшими улучшениями в 2009 году: JPA 2.0 (JSR-317). Это был долгожданный стандарт, который включал поддержку многих функций, которые требовали разработчики EJB, в том числе поддержку улучшенного моделирования объектов, наследования, полиморфизма, расширенного языка запросов и богатых метаданных для спецификации объектного / реляционного отображения.

Но самым большим достижением JPA была не только стандартизация технологии персистентности ORM для Java-разработчиков, но и включение лучших практик для упрощения персистентности на основе POJO (избавление от старой и тяжелой архитектуры Entity Bean).

Спецификация JPA опирается на идеи, концепции и стандарты из ведущих сред персистентности, таких как TopLink, Hibernate и Java Data Objects (JDO), а также из более ранней персистентности, управляемой контейнером EJB. Но JPA сама по себе является лишь спецификацией; набор интерфейсов и требует реализации и базы данных для сохранения.

Вот где вступает в игру Versant. Команда Versant провела обзор современного состояния технологии JPA, чтобы представить вам Versant JPA, поставщика JPA 2.0 для технологии Versant Database.

В этой статье, состоящей из нескольких частей, я познакомлю вас с основными строительными блоками API-интерфейса Java Persistence, а также проведу вас через реализацию Versant JPA с точки зрения пользователя (разработчика).

 

юридические лица

Сущность — это в основном легкий постоянный объект домена. Форма сущности определяется в классе с возможностью сохранения (он же класс сущности) путем добавления аннотации @Entity ( примечание 1 ):

Рисунок 1: класс сущностей JPA — это обычный Java-класс с добавлением аннотации @Entity

Традиционно состояние такого объекта будет сохраняться в таблице в реляционной базе данных, в то время как экземпляры такого объекта будут соответствовать отдельным строкам в таблице. Необходимая информация о сопоставлении должна быть добавлена ​​к соединению (или по умолчанию реализацией JPA), чтобы сопоставить объект вашего домена с таблицами.

Можете ли вы представить себе избавление от всех затрат на реляционные ресурсы при использовании JPA? Введите Versant JPA.

Обратите внимание, что в приведенном выше примере Person нам нужны только две аннотации: @Entity и @Id . @Id аннотаций обозначает поле , который будет использоваться для идентичности объекта сущности в хранилище данных (или первичного ключа в реляционной жаргоне). Это действительно все, что вам нужно, чтобы сделать этот класс сущностей, используя Versant JPA. Так как Versant хранит экземпляры класса сущности как объекты, никаких дополнительных аннотаций, указывающих информацию отображения, не требуется.

 

Персистентность

JPA Persistence Unit — это логическая группа пользовательских персистентных классов со связанными параметрами, такими как соединение с базой данных:

Изображение 2: блок персистентности JPA

 

В модуле постоянства перечислены классы, поддерживающие постоянство (т.е. классы сущностей), которые составляют модель данных вашего приложения. Это элементы <class>, которые вы можете увидеть в приведенном выше файле persistence.xml . Экземпляры этих классов будут храниться в базе данных, определенной настройкой соединения.

Примечание. Единица постоянства определена в файле XML с именем persistence.xml, который находится в каталоге приложения META_INF .

 

Entity Manager

С JPA объекты класса сущности в вашем приложении управляются EntityManager .   Фабрика менеджеров сущностей отвечает за менеджеров сущностей. Это фабрика, связанная с единицей персистентности через свойство подключения к базе данных Versant

Интерфейс EntityManager в основном предоставляет API для взаимодействия с сущностью. Сущность может находиться в разных состояниях, которые тесно связаны со службами EntityManager :

Изображение 3: Жизненный цикл сущности в JPA

 

Объекты, созданные впервые, находятся в состоянии «Новый» и не являются частью базы данных, и EntityManager об этом не знает. Когда EntityManager выполняет «постоянную» операцию над объектом, состояние объекта изменяется на «Управляемый». Это должно быть сделано в активной транзакции (см. Транзакции ниже), которая после фиксации эффективно сохранит сущность в базе данных.

Объекты, извлеченные из базы данных (например, с помощью запросов), также находятся в состоянии «Управляемый», поэтому при изменении в транзакции изменения будут сохранены в базе данных при следующем подтверждении.

Операция «удалить» позволяет EntityManager пометить объект для удаления (состояние изменяется с «Управляется» на «Удалено»).
и объект удаляется из базы данных при фиксации).

Наконец, сущности могут быть полностью отключены от EntityManager, поэтому они достигают состояния «Отдельно» (например, сущности переходят в это состояние, когда его EntityManager закрыт).

Наиболее важные сервисы API EntityManager:

  • сохраняться — сохраняет новую сущность.
  • объединить — обновляет состояние объекта в базе данных.
  • detachотсоединяет объект от базы данных.
  • удалить — удаляет экземпляр объекта.

 

Итак, как мне начать работать с EntityManager в Versant JPA?

Первым делом нужно создать фабрику и сообщить ей, какой постоянный модуль использовать для его конфигурации

EntityManagerFactory emf =

Persistence.createEntityManagerFactory("jpa_tutorial_persist~ ence_unit");

Получившуюся фабрику теперь можно вызвать, чтобы предоставить вам EntityManager:

EntityManager em = emf.createEntityManager(); 

 

операции

Все модификации постоянных объектов, включая создание новых, производятся в транзакции. Транзакция — это единица работы, выполняемая клиентом, вашим приложением и сервером базы данных.

EntityManager несет ответственность за транзакции. Вы можете получить доступ к транзакции с помощью метода менеджера getTransaction () . Вы работаете с транзакцией, помечая ее начальную и конечную точки методами begin () и commit () :

em.getTransaction().begin();

// do stuff with persistent objects . . .

em.getTransaction().commit();

Любые изменения в объектах сущности в транзакции записываются в базу данных (фиксируется) при вызове метода commit () транзакции . Если вместо commit () есть какое-то непредвиденное обстоятельство , вы можете вызвать метод rollback транзакции (), чтобы отменить любые сделанные вами изменения.

Когда вы создаете новый экземпляр класса сущностей, EntityManager не знает, должен ли экземпляр быть постоянным или нет. Таким образом, вы должны сообщить EntityManager, что вы хотите, чтобы экземпляр сохранялся в базе данных, вызывая метод persist () менеджера сущностей для нового экземпляра объекта (чтобы ваш объект в конечном итоге перешел в состояние «Управляемый»).

 

Запросы

Хранение объектов не имеет смысла, если вы не можете найти их снова. JPA использует JPA Query Language (JPQL), который можно рассматривать как объектно-ориентированную версию SQL. Пользователи, знакомые с SQL, должны найти JPQL очень простым в изучении и использовании.

Запрос выполняется путем запроса EntityManager для экземпляра Query . Требуемый критерий запроса, предикат, предоставляется методу createQuery () менеджера .

Query query = em.createQuery("select p from Person p");

Предикат запроса (выраженный в виде строки, которая соответствует синтаксису JPQL) просто выбирает все члены из класса сущностей Person . Запрос отправляется на V / OD-сервер и возвращается коллекция результатов:

List<Person> resultList = query.getResultList();

Затем мы можем использовать цикл для вывода результатов:

for (Person person : resultList) {

System.out.println(person);

}

или, альтернативно, удалить все объекты Person из базы данных:

for (Person person : resultList) {

em.remove(person);

}

Как видите, очень легко и просто начать работу с Versant JPA. Если у вас есть опыт работы с Java Persistence API, вы будете чувствовать себя как дома.

Во второй части этой серии я покажу вам более продвинутые функции, такие как каскадное сохранение (постоянство по достижимости), более сложные запросы, отслеживание изменений и объединение отдельных объектов.

Если вы хотите попробовать рабочий пример всех функций, обсуждаемых здесь, пожалуйста, попробуйте и ознакомьтесь с техническим обзором JPA от Versant, который доступен в качестве бесплатной пробной версии:

 

http : // сообщество . Versant . com / jpa . ASPX

 

Примечание 1. В целом все аннотации JPA можно заменить путем определения тегов в XML-файле ORM модуля сохраняемости.