#java #jpa #entitymanager #tapestry #hibernate-entitymanager
#java #jpa #entitymanager #tapestry #спящий режим-entitymanager
Вопрос:
В Tapestry есть (в основном) два способа получения EntityManager
экземпляра:
- Вводя
EntityManager
непосредственно:@Inject @PersistenceContext(unitName = MyPersistenceUnit) private EntityManager entityManager;
- Используя
EntityManagerManager
(который также вводится):EntityManager entityManager = entityManagerManager.getEntityManager(MyPersistenceUnit);
В EntityManagerManager
его javadoc указано, что он управляет EntityManager
одним потоком:
Управляет
EntityManager
s для текущего потока. AnEntityManager
создается по мере необходимости и закрывается в конце каждого запроса.Реализация этой службы выполняется для каждого потока.
Применимо ли это также для EntityManager
непосредственного внедрения? Так, например, если я начну транзакцию в одном потоке, вот так:
entityManager.getTransaction().begin();
будет ли транзакция EntityManager
в другом потоке неактивной, т. Е. Будет entityManager.getTransaction().isActive()
false для других потоков, в которые EntityManager
также был введен?
В более общем плане мне любопытно, что следует использовать. В чем различия / преимущества одного над другим?
Ответ №1:
Оба подхода равны, вы можете использовать любой с одинаковыми гарантиями: EntityManager
всегда является экземпляром для каждого потока, между потоками ничего не разделяется. Каждый EntityManager
из них отбрасывается / закрывается в конце каждого запроса (при PerthreadManager#cleanup()
вызове метода).
EntityManagerManager
используется в качестве источника, в EntityManagerObjectProvider
котором создаются экземпляры EntityManager
, чтобы вы могли просто писать @Inject EntityManager
, а не получать его от менеджера явно.