2014-01-10 2 views
32

В нескольких проекте я успешно использовалPersistenceUnit против PersistenceContext

@PersistenceUnit(unitName = "MiddlewareJPA") 
EntityManagerFactory emf; 
... 
EntityManager entityManager = emf.createEntityManager(); 

получить EntityManager для соединения с базой данных, но несколько дней назад я пытался переместить мой проект Jboss EAP 6.2 и он не мог создать EntityManager. Я его и прибегая к помощи я обнаружил, что я должен попытаться изменить @PersistenceUnit к

@PersistenceContext(unitName = "MiddlewareJPA") 
private EntityManager entityManager; 

получить EntityManager. Это сработало, но я не знаю почему. В чем разница между PersistenceUnit и PersistenceContext? Каковы плюсы и минусы каждого из них? Где мы должны использовать один из них?

+0

Рассмотрите возможность использования спецификации CDI (новая в JEE 6) для выполнения ваших инъекций зависимостей, чтобы у вас был более «универсальный» способ сделать это вместо большой кучи аннотаций API/фреймворка. Это на самом деле не обеспечивает поддержку для инъекций менеджера объектов из коробки непосредственно в JEE 6, но есть документированные способы борьбы с этим. http://www.mastertheboss.com/cdi/cdi-and-jpa-tutorial – Gimby

+1

В дополнение к доступным ответам: вот очень полезная статья, которая также может помочь ответить на вопросы OP: [JPA Concepts] (http: //tomee.apache.org/jpa-concepts.html) – informatik01

ответ

31

Я не знаю, как это работает именно в Java EE, но весной, когда вы указываете аннотацию @PersistenceContext, она вводит EntityManager. Где он получает EntityManager? Неправильно создать один EntityManager на весь срок службы приложения, позвонив по номеру EntityManagerFactory.createEntityManager(). Таким образом, вместо этого используется специальная реализация интерфейса EntityManager. Он имеет внутреннюю изменчивую нить-локальную ссылку на realEntityManager. Реализации методов просто перенаправляют вызовы на это realEntityManager. И есть слушатель сервлетов, который перед каждым запросом получает EM, вызывая EMF.createEntityManager() и назначая его этой внутренней ссылке специального EM. Также этот слушатель управляет транзакциями по телефону getTransaction().begin(), .commit() и .rollback() по состоянию на realEM. Это очень упрощенное описание выполненной работы. И я считаю, что контейнер JEE делает то же самое, что и Spring.

В общем случае лучше вводить EntityManager, потому что с EntityManagerFactory и @PersistenceUnit вы должны создать/уничтожить EntityManager каждый раз руками и управлять транзакциями тоже.

42

PersistenceUnit вводит EntityManagerFactory, а PersistenceContext вводит EntityManager. Как правило, лучше использовать PersistenceContext, если вам действительно не нужно управлять жизненным циклом EntityManager вручную.

+0

Приятный и простой! – webDeveloper

6

EntityManagers получить с помощью @PersistenceContext являются Контейнер управляемого объекта менеджер, как контейнер будет нести ответственность за управление «Сущность Управление», а EntityManagers получить с помощью @PersistenceUnit/entityManagerFactory.createEntityManager() являются Применение управляемого объекта менеджер и разработчик должен управлять некоторыми вещами в коде (например, для освобождения ресурсов, полученных EntityManager).

Смежные вопросы