gpt4 book ai didi

spring - 我可以像使用 Spring 一样使用 CDI 和 @PersistenceContext 注入(inject) JPA EntityManager 吗?

转载 作者:行者123 更新时间:2023-12-05 01:20:53 25 4
gpt4 key购买 nike

在 Spring 中,我可以注入(inject) javax.persistence.EntityManager
使用注解 @javax.persistence.PersistenceContext 进入 Spring bean , 像这样:

@Service
public class MyRepository {
@PersistenceContext
private EntityManager entityManager;
}

这在 Spring 文档的 20.5.2 Implementing DAOs based on plain JPA 章节中有记录。 .

如果我不使用 Java EE 容器,有没有办法使用 CDI(特别是 Weld)来做到这一点?

特别是,是否可以重用注释 @PersistenceContext对于 CDI(因为现有代码将它与 Spring 一起使用)?

据我了解:当使用 Java EE 容器时,容器会解释注解并注入(inject)一个 EntityManager。那是对的吗?有没有办法使用 Weld 让它工作,但没有 Java EE 容器?

我尝试使用 Weld 将上面的类注入(inject)到另一个类中(在 Tomcat 中,没有 Java EE)。注入(inject)发生,因此 Weld 正确创建了 MyRepository 的实例, 但是字段 MyRepository.entityManagernull , 好像注释 @PersistenceContext被忽略了。

这里发生了什么(或者更确切地说,没有发生)?

最佳答案

你可以这样做:
创建 实体经理工厂制作人

public class EntityManagerFactoryProducer {

@Produces
@ApplicationScoped
public EntityManagerFactory create() {
return Persistence.createEntityManagerFactory("PU");
}

public void destroy(@Disposes EntityManagerFactory factory) {
factory.close();
}

}

并创建 实体经理制作人
public class EntityManagerProducer {

@Inject
transient EntityManagerFactory emf;

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

public void destroy(@Disposes EntityManager em) {
em.close();
}
}

然后您可以使用依赖注入(inject)(CDI 将为每个请求创建一个 em)
@Inject
EntityManager entityManager;

您必须在 main 方法中启动 CDI 上下文
public static void main(String[] args) throws IOException {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
Application application = container.instance().select(Application.class).get();
application.run();
weld.shutdown();
}

附言。如果您有多个 PU,请使用 @Qualifier

关于spring - 我可以像使用 Spring 一样使用 CDI 和 @PersistenceContext 注入(inject) JPA EntityManager 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40469121/

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