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.

