【问题标题】:Tapestry `EntityManager` vs `EntityManagerManager`Tapestry `EntityManager` 与 `EntityManagerManager`
【发布时间】:2020-10-02 09:54:19
【问题描述】:

在 Tapestry 中(主要)有两种方法来获取 EntityManager 实例:

  1. 通过直接注入EntityManager
    @Inject
    @PersistenceContext(unitName = MyPersistenceUnit)
    private EntityManager entityManager;
    
  2. 通过使用EntityManagerManager(也是注入的):
    EntityManager entityManager = entityManagerManager.getEntityManager(MyPersistenceUnit);
    

EntityManagerManager 在其 javadoc 中声明它为每个线程管理一个 EntityManager

为当前线程管理EntityManagers。一个 EntityManager 根据需要创建并在最后关闭 每个请求。

这个服务的实现是每线程的。

这是否也适用于直接注入EntityManager?例如,如果我在一个线程中启动事务,就像这样:

entityManager.getTransaction().begin();

EntityManager 在另一个线程中的事务是否会处于非活动状态 - 即 entityManager.getTransaction().isActive() 对于其他线程是否为假,EntityManager 也被注入?


更一般地说,我很好奇应该使用什么。两者相比有什么区别/优势?

【问题讨论】:

    标签: java jpa entitymanager tapestry hibernate-entitymanager


    【解决方案1】:

    两种方法是相同的,您可以使用任何具有相同保证的方法: EntityManager 始终是每个线程的实例,线程之间不共享任何内容。每个EntityManager 在每个请求结束时被丢弃/关闭(当PerthreadManager#cleanup() 方法被调用时)。

    EntityManagerManager 用作EntityManagerObjectProvider 中的源,它生成EntityManager 的实例,因此您可以简单地编写@Inject EntityManager 而不是从管理器显式获取它。

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 2011-11-10
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多