Метод | Описание |
---|---|
void persist(Object entity) | Делает так, что экземпляр помещается под управление, а также обеспечивает постоянство экземпляра |
Выполняет поиск сущности указанного класса и первичного ключа | |
Извлекает экземпляр, выборка состояния которого может быть отложенной | |
void remove(Object 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).
@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;
··// Конструкторы, геттеры, сеттеры
}
@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.