У нас есть большое приложение, предварительно JEE5, который использует JPA, но не использует CDI или EJB, так EntityManager
не получает впрыскивается в DAO,, а создается с помощьюCDI Инъекция в созданных объектов
Persistence.createEntityManagerFactory(...).createEntityManager()
, и затем сохраняется в переменной ThreadLocal
. Эта грязная работа по созданию диспетчера сущностей инкапсулируется в класс утилиты EntityManagerUtil
, используемый DAO, поэтому бизнес-логика не имеет дело с менеджером низкого уровня; Кроме того, это приложение использует aspectj и аннотации для создания границ транзакций, а в аспектах транзакции используется тот же класс EntityManagerUtil
, что и DAO, чтобы получить диспетчер сущности для создания транзакции.
Мы должны перенести это приложение на wildfly 9 сейчас. Это не работает из коробки, так как aspectj не может быть развернута в wildfly, поэтому наши аспекты, которые создают и фиксируют транзакции, не применяются, и ничего не работает. Чтобы заставить его работать, нам нужно ввести EntityManager
в DAO и использовать транзакционный механизм EJB или CDI, но, похоже, это также означает, что нам нужно вводить DAO в любые классы, используя их, а затем вводить эти классы в классы выше на иерархии вызовов и т. д. (как будто класс создается с использованием «нового», он не управляется контейнером, и в него ничего не вводится). Поскольку приложение является большим, и у нас есть экземпляр объекта повсюду, это кажется невыполнимой задачей.
Так что мне интересно, можно ли изолировать использование инъекций в DAO и более низких уровнях, поэтому код вызывающего абонента, который использует DAO, не изменится и все равно создаст DAO с использованием «нового», но DAO будет использовать диспетчер инъецируемых сущностей и CDI или EJB?
Любые предложения приветствуются, спасибо!
на более высоком уровне, когда ящик впрыскивается, можете ли вы сохранить его в локальной сети? Позже, новые DAO могут искать его из локальной сети. – ZhongYu
Не могли бы вы немного рассказать о том, как используется ваш 'EntityManagerUtil'? Вам, скорее всего, придется либо полностью управлять (сервером), либо вам придется покинуть контейнер из него. –