Изучаем Java EE 7 - [87]

Шрифт
Интервал

Номер версии целевой базы данных
javax.persistence.database-minor-versionДополнительный номер версии целевой базы данных
javax.persistence.ddl-create-script-sourceИмя сценария, создающего базу данных
javax.persistence.ddl-drop-script-sourceИмя сценария, удаляющего базу данных
javax.persistence.sql-load-script-sourceИмя сценария, загружающего информацию в базу данных
javax.persistence.schema-generation.database.actionОпределяет действие, которое должно предприниматься в отношении базы данных (none, create, drop-and-create, drop)
javax.persistence.schema-generation.scripts.actionОпределяет действие, которое должно предприниматься в отношении DDL-сценариев (none, create, drop-and-create, drop)
javax.persistence.lock.timeoutЗначение времени ожидания в миллисекундах при пессимистической блокировке
javax.persistence.query.timeoutЗначение времени ожидания в миллисекундах при запросах
javax.persistence.validation.group.pre-persistГруппы, намеченные для валидации при наступлении события pre-persist
javax.persistence.validation.group.pre-updateГруппы, намеченные для валидации при наступлении события pre-update
javax.persistence.validation.group.pre-removeГруппы, намеченные для валидации при наступлении события pre-remove

Манипулирование сущностями

Мы используем менеджер сущностей как для простого манипулирования сущностями, так и для выполнения комплексных JPQL-запросов. При манипулировании одиночными сущностями интерфейс менеджера можно рассматривать как обобщенный объект доступа к данным (Data Access Object — DAO), который позволяет выполнять CRUD-операции в отношении любой сущности (табл. 6.2).


Таблица 6.2. Методы интерфейса менеджера сущностей для манипулирования сущностями
МетодОписание
void persist(Object entity)Делает так, что экземпляр помещается под управление, а также обеспечивает постоянство экземпляра
T find(Class entityClass, Object primaryKey)Выполняет поиск сущности указанного класса и первичного ключа
T getReference(Class entityClass, Object primaryKey)Извлекает экземпляр, выборка состояния которого может быть отложенной
void remove(Object entity)Удаляет экземпляр сущности из контекста постоянства и основной базы данных
T merge(T entity)Обеспечивает слияние состояния определенной сущности с текущим контекстом постоянства
void refresh(Object entity)Обновляет состояние экземпляра из базы данных, перезаписывая все изменения, внесенные в сущность, если таковые имеются
void flush()Синхронизирует контекст постоянства с основной базой данных
void clear()Очищает контекст постоянства, приводя к тому, что все сущности, которые находятся под управлением, оказываются отсоединенными
void detach(Object entity)Убирает определенную сущность из контекста постоянства, приводя к тому, что сущность, которая находится под управлением, оказывается отсоединенной
boolean contains(Object entity)Проверяет, является ли экземпляр сущностью, находящейся под управлением, которая относится к текущему контексту постоянства

Чтобы помочь вам лучше понять эти методы, я воспользуюсь простым примером однонаправленной связи «один к одному» между Customer и Address. Обе сущности обладают автоматически генерируемыми идентификаторами (благодаря аннотации @GeneratedValue), а в случае с Customer (листинг 6.5) имеет место отложенная выборка по отношению к Address (листинг 6.6).


Листинг 6.5. Сущность Customer с односторонней связью «один к одному» с Address

>@Entity

>public class Customer {

>··@Id @GeneratedValue

>··private Long id;

>··private String firstName;

>··private String lastName;

>··private String email;

>··@OneToOne (fetch = FetchType.LAZY)

>··@JoinColumn(name = "address_fk")

>··private Address address;

>··// Конструкторы, геттеры, сеттеры

>}


Листинг 6.6. Сущность Address

>@Entity

>public class Address {

>··@Id @GeneratedValue

>··private Long id;

>··private String street1;

>··private String city;

>··private String zipcode;

>··private String country;

>··// Конструкторы, геттеры, сеттеры

>}

Эти две сущности будут отображены в структуру базы данных, которая показана на рис. 6.2. Обратите внимание, что столбец ADDRESS_FK является внешним ключом, ссылающимся на ADDRESS.


Рис. 6.2. Таблицы CUSTOMER и ADDRESS


Для лучшей удобочитаемости фрагментов кода, приведенных в следующем подразделе, предполагается, что атрибут em имеет тип EntityManager, а tx — тип EntityTransaction.


Обеспечение постоянства сущности

Обеспечение постоянства сущности подразумевает вставку в базу данных информации, которой там еще нет (в противном случае будет сгенерировано исключение EntityExistsException). Для этого необходимо создать новый экземпляр сущности с использованием оператора new, задать значения для атрибутов, привязать одну сущность к другой, если есть ассоциации, и, наконец, вызвать метод EntityManager.persist(), как показано в варианте тестирования JUnit в листинге 6.7.


Листинг 6.7. Обеспечение постоянства Customer и Address

>Customer customer = new Customer("Энтони", "Балла", "[email protected]");

>Address address = new Address("Ризердаун Роуд", "Лондон", "8QE", "Англия");

>customer.setAddress(address);


>tx.begin();

>em.persist(customer);


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.