Tapestry `EntityManager` против `EntityManagerManager`

#java #jpa #entitymanager #tapestry #hibernate-entitymanager

#java #jpa #entitymanager #tapestry #спящий режим-entitymanager

Вопрос:

В Tapestry есть (в основном) два способа получения EntityManager экземпляра:

  1. Вводя EntityManager непосредственно:
     @Inject
    @PersistenceContext(unitName = MyPersistenceUnit)
    private EntityManager entityManager;
      
  2. Используя EntityManagerManager (который также вводится):
     EntityManager entityManager = entityManagerManager.getEntityManager(MyPersistenceUnit);
      

В EntityManagerManager его javadoc указано, что он управляет EntityManager одним потоком:

Управляет EntityManager s для текущего потока. An EntityManager создается по мере необходимости и закрывается в конце каждого запроса.

Реализация этой службы выполняется для каждого потока.

Применимо ли это также для EntityManager непосредственного внедрения? Так, например, если я начну транзакцию в одном потоке, вот так:

 entityManager.getTransaction().begin();
  

будет ли транзакция EntityManager в другом потоке неактивной, т. Е. Будет entityManager.getTransaction().isActive() false для других потоков, в которые EntityManager также был введен?


В более общем плане мне любопытно, что следует использовать. В чем различия / преимущества одного над другим?

Ответ №1:

Оба подхода равны, вы можете использовать любой с одинаковыми гарантиями: EntityManager всегда является экземпляром для каждого потока, между потоками ничего не разделяется. Каждый EntityManager из них отбрасывается / закрывается в конце каждого запроса (при PerthreadManager#cleanup() вызове метода).

EntityManagerManager используется в качестве источника, в EntityManagerObjectProvider котором создаются экземпляры EntityManager , чтобы вы могли просто писать @Inject EntityManager , а не получать его от менеджера явно.