EntityManager
- основной интерфейс ORM, служит для управления персистентными сущностями.
Ссылку на EntityManager
можно получить через интерфейс Persistence
, вызовом метода getEntityManager()
.
Полученный экземпляр EntityManager
привязан к текущей транзакции, то есть все вызовы getEntityManager()
в рамках одной транзакции возвращают один и тот же экземпляр EntityManager
. После завершения транзакции обращения к данному экземпляру невозможны.
Экземпляр EntityManager
содержит в себе "персистентный контекст" – набор экземпляров сущностей, загруженных из БД или только что созданных. Персистентный
контекст является своего рода кэшем данных в рамках транзакции.
EntityManager
автоматически сбрасывает в БД все изменения, сделанные в его персистентном контексте, в момент коммита транзакции, либо при
явном вызове метода flush()
.
Интерфейс EntityManager
, используемый в CUBA-приложениях, в основном повторяет стандартный javax.persistence.EntityManager. Рассмотрим его основные методы:
-
persist()
- вводит новый экземпляр сущности в персистентный контекст. При коммите транзакции командой SQLINSERT
в БД будет создана соответствующая запись. -
merge()
- переносит состояние отсоединенного экземпляра сущности в персистентный контекст следующим образом: из БД загружается экземпляр с тем же идентификатором, в него переносится состояние переданного Detached экземпляра и возвращается загруженный Managed экземпляр. Далее надо работать именно с возвращенным Managed экземпляром. При коммите транзакции командой SQLUPDATE
в БД будет сохранено состояние данного экземпляра. -
remove()
- удалить объект из базы данных, либо, если включен режим мягкого удаления, установить атрибутыdeleteTs
иdeletedBy
.Если переданный экземпляр находится в Detached состоянии, сначала выполняется
merge()
. -
find()
- загружает экземпляр сущности по идентификатору.При формировании запроса к БД учитывается представление, переданное в параметре данного метода, либо установленное для всего
EntityManager
методомsetView()
. В результате в персистентном контексте окажется граф объектов, для которого загружены все не-lazy атрибуты представления. Остальные атрибуты можно дозагрузить обращением к соответствующим методам доступа объектов, либо вызовом методаfetch()
. -
createQuery()
- создать объектQuery
для выполнения JPQL запроса.Рекомендуется использовать вариант метода с передачей класса сущности для получения экземпляра
TypedQuery
. -
createNativeQuery()
- создать объектQuery
для выполнения SQL запроса. -
setView()
- устанавливает представление по умолчанию, с которым будет производиться последующая загрузка сущностей методомfind()
либо JPQL запросами. В результате жадно загружены будут все не-lazy
атрибуты представления.Если в данный метод передать
null
, либо не вызывать его вообще, загрузка будет производиться в соответствие с правилами аннотаций сущностей.Представления, явно переданные в метод
find()
или установленные в объектеQuery
имеют приоритет над установленным данным методом. -
addView()
- аналогичен методуsetView()
, но в случае наличия уже установленного вEntityManager
представления, не заменяет его, а добавляет атрибуты переданного представления. -
fetch()
- обеспечивает для экземпляра сущности загрузку всех атрибутов указанного представления, включаяlazy
атрибуты. Экземпляр сущности должен быть в Managed состоянии.Данный метод рекомендуется вызывать перед коммитом транзакции, если представление содержит
lazy
атрибуты, а экземпляр сущности нужно отправить на клиентский уровень. В этом случае только после вызоваfetch()
можно быть уверенным, что все нужные клиентсткому коду атрибуты действительно загружены. -
reload()
- перезагрузить экземпляр сущности с указанным представлением. Обеспечивает загрузку всех атрибутов представления, вызывая внутри себя методfetch()
. -
isSoftDeletion()
- проверяет, находится ли данныйEntityManager
в режиме мягкого удаления. -
setSoftDeletion()
- устанавливает режим мягкого удаления для данного экземпляраEntityManager
. -
getConnection()
- возвращаетjava.sql.Connection
, через который выполняет запросы данный экземплярEntityManager
, и, соответственно, текущая транзакция. Закрывать такое соединение не нужно, оно будет закрыто при завершении транзакции. -
getDelegate()
- возвращаетjavax.persistence.EntityManager
, предоставляемый реализацией ORM.