gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:38 29 4
gpt4 key购买 nike

当我们在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com