java - EJB 容器上的 CDI EntityManager 注入(inject) VS @PersistenceContext entitymanager

标签 java jpa ejb cdi entitymanager

当我们在 JAVA EE 环境中的 EntityManager 上使用 @PersistenceContext 注释时,容器将创建 entityManagerFactory(我猜是整个 session )并将为每个请求创建一个新的 EntityManager(通过代理它)。

但是在没有 JAVA EE 容器的情况下使用 CDI 我看到了这样的东西:

public class EntityManagerProducer {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("livraria");

    @Produces  
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void close(EntityManager em) {
    em.close();
}

用那种方法和CDI,会不会有同样的效果和性能? 在此先感谢您的帮助

最佳答案

不,效果不一样。正如 Gab 在之前的回答中所说,@PersistenceContext 默认情况下为每个事务注入(inject)一个单独的实体管理器。还有一个选项可以使用 EXTENDED persistence context ,但这超出了您的问题范围。

使用您使用 CDI 提供的代码,您将获得每个注入(inject)点的一个实例,除非您为每个事务创建注入(inject) bean(很可能不是)。

但是,您可以为您的实体管理器使用 RequestScoped 生产者,如下所示:

 public class EntityManagerProducer {
     private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("livraria");

     @Produces
     @RequestScoped
     public EntityManager getEntityManager() {
         return emf.createEntityManager();
     }
 }

这将在 Web 应用程序中为您提供类似的语义,但如果您打算混合使用 EJB 和非 EJB 代码,则可能会遇到一些陷阱,因为该实体管理器不知道正在进行的事务。其中一些已涵盖 here .

你也应该检查这个类似的问题Getting a reference to EntityManager in Java EE applications using CDI在那里你可以找到很多关于这个问题的精彩讨论。

关于java - EJB 容器上的 CDI EntityManager 注入(inject) VS @PersistenceContext entitymanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298857/

相关文章:

java - 在 Java 中向字符串行为添加转义字符

java - Spring Data JPA 中的 CrudRepository 和 JpaRepository 接口(interface)有什么区别?

maven - Gradle:找不到提供的方法()(组)

java - em.createNativeQuery() 返回空指针异常,无法加入 CMTTransaction

java - 是否有更新使用 EJB 的应用程序的首选方法?

java - 在 EJB 中使用 @Timeout 代替 Thread.sleep()

java - 如何使用 DOM 解析器获取标签值

java - spring boot中如何访问pcf用户服务

java - Collection<Sub> 转换为 SuperCollection<Super>

hibernate - JPQL 和继承