В сессионном компоненте внедренный менеджер сущностей управляется контейнером и по умолчанию имеет объем транзакции.
Это означает, что когда вы вызываете любой метод в сессионном компоненте, и транзакция запускается, запускается контекст персистентности менеджера сущностей. Когда транзакция зафиксирована или откатана, она заканчивается. Таким образом, не существует сценария, в котором вы должны явно закрывать менеджер сущностей.
Кроме того, когда уже выполняется транзакция, она присоединяется по умолчанию, и когда к этой транзакции уже добавлен постоянный контекст, он распространяется вместо создаваемой новой.
Сессионные компоненты с сохранением состояния имеют другую опцию, и это extended persistence context
. Этот элемент связан с областью действия компонента с состоянием, а не с отдельными транзакциями. Вам все еще не нужно закрывать себя здесь.
Затем вы также можете ввести EntityManagerFactory
(используя @ PersistenceUnit ), а затем получить от него менеджер сущностей: в этом случае у вас будет application managed entity manager
. В этом случае вам придется явно закрыть его.
Источники данных JTA (транзакционные источники данных) по умолчанию используются с менеджерами управляемых объектов контейнеров. Контейнер позаботится обо всем здесь. не-JTA источники данных предназначены для ситуаций, когда вам нужны отдельные соединения с БД, возможно, вне какой-либо выполняемой транзакции, для которых вы можете сами установить режим автоматической фиксации, фиксации, отката и т. д.
Эти два разных типа источника данных могут быть определены в orm.xml для единицы сохраняемости. Если вы определяете персистентную единицу с источником данных, отличным от JTA, вы обычно создаете для него менеджер сущностей, используя фабрику, а затем управляете всем самостоятельно.
Обновление:
Что касается Virtual Private Database
, то здесь вам, по-видимому, нужно индивидуальное соединение для каждого менеджера сущностей, но обычный способ сделать это - подключить блок персистентности к общему источнику данных. Я думаю, что здесь может понадобиться источник данных, который знает о контексте пользователя, когда запрашивается соединение.
Если вы полностью обойдете контейнер и даже в значительной степени обойдете абстракцию JPA, вы можете перейти непосредственно в Hibernate. У него есть провайдеры, которых вы можете зарегистрировать по всему миру, например DriverManagerConnectionProvider
и DatasourceConnectionProvider
. Если вы предоставите свои собственные реализации для них с установщиком для фактического соединения, вы можете запросить их у конкретного экземпляра диспетчера сущностей непосредственно перед его использованием, а затем установить в нем собственное соединение.
Это выполнимо, но, разумеется, немного хакерски. Надеюсь, кто-то другой может дать более «официальный» ответ. Конечно, лучше всего, если Oracle предоставит официальный плагин для, например, EclipseLink для поддержки этого. Этот документ намекает, что он делает:
TopLink / EclipseLink: поддержка фильтрации данных через их
@AdditionalCriteria аннотации и XML. Это позволяет произвольный JPQL
фрагмент, который будет добавлен ко всем запросам для объекта. Фрагмент
может содержать параметры, которые могут быть установлены через единицу сохранения или
свойства контекста во время выполнения. Oracle VPD также поддерживается, включает
Проверка подлинности прокси Oracle и изолированные данные.
См. Также Как использовать EclipseLink JPA с аутентификацией Oracle Proxy .