3.2.6.2.1. DataManager vs. EntityManager

И DataManager и EntityManager предназначены для выполнения операций с сущностями (CRUD). Ниже приведены различия между этими интерфейсами.

DataManager EntityManager

DataManager доступен и на среднем слое и на клиентском уровне.

EntityManager доступен только на среднем слое.

DataManager является синглтон-бином.

Ссылку на EntityManager необходимо получать через интерфейс Persistence.

DataManager содержит несколько высокоуровневых методов для работы с detached сущностями: load(), loadList(), reload(), commit().

EntityManager в большой степени повторяет стандартный javax.persistence.EntityManager.

DataManager на самом деле делегирует выполнение реализациям DataStore, поэтому особенности DataManager, перечисленные ниже, актуальны только для наиболее часто встречающегося случая, когда вы работаете с сущностями, хранящимися в реляционной базе данных.

DataManager EntityManager

DataManager всегда стартует новую транзакцию внутри. На среднем слое можно использовать TransactionalDataManager, если необходимо реализовать сложное транзакционное поведение.

Для работы с EntityManager необходима открытая транзакция.

DataManager загружает частичные сущности в соответствие с представлением. Есть некоторые исключения, см. подробности.

EntityManager всегда загружает все локальные атрибуты. Если используется представление, оно влияет только на загрузку ссылочных атрибутов. См. подробности.

DataManager выполняет только JPQL запросы. Кроме того, он имеет отдельные методы для загрузки сущностей: load(), loadList(); и скалярных и агрегатных значений: loadValues().

EntityManager может выполнять любые JPQL или native (SQL) запросы.

DataManager проверяет права доступа, когда вызывается с клиентского уровня.

EntityManager не проверяет права доступа.

При работе на клиентском уровне доступен только DataManager. На среднем слое, используйте TransactionalDataManager когда необходимо реализовать атомарную логику внутри транзакции, или EntityManager если он лучше подходит для решения задачи. Вообще, на среднем слое можно использовать любой из этих интерфейсов.

Если вам нужно обойти ограничения DataManager при работе на клиентском уровне, создайте свой сервис и используйте TransactionalDataManager или EntityManager для работы с данными. В сервисе можно проверять права пользователя с помощью интерфейса Security и возвращать клиенту данные в виде персистентных или неперсистентных сущностей или произвольных значений.