gpt4 book ai didi

java - CDI 注入(inject)和 JPA EntityManager

转载 作者:行者123 更新时间:2023-11-30 07:34:24 27 4
gpt4 key购买 nike

我看到两个类(class):

/** * 此类使用 CDI 将 Java EE 资源(例如持久性上下文)别名为 CDI bean * */

public class Resources {
@Produces
@PersistenceContext
private EntityManager em;

@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}

@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}

// The @Stateless annotation eliminates the need for manual transaction demarcation
@Stateless
public class MemberRegistration {

@Inject
private Logger log;

@Inject
private EntityManager em;

@Inject
private Event<Member> memberEventSrc;

public void register(Member member) throws Exception {
log.info("Registering " + member.getName());
em.persist(member);
memberEventSrc.fire(member);
}
}

我对此有两个问题:

1)MemberRegistration可以直接注入(inject)“log”和“em”,是因为Resources已经使用@Produces注解定义了它们吗?如果没有 Resources 类,MemberRegistration 类仍然可以工作吗?我试图了解这两个类是否相关或如何相关,以及 CDI 如何工作。

2) 在MemberRegistration的register方法中,只使用了一个“em.persist()”方法。使用 EntityManager 的完整流程如下所示。在示例应用程序中,我没有看到使用方法“commit()”和“close()”。那么事务是如何提交和关闭的呢?

    EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist( SomeObject );
entityManager.getTransaction().commit();
entityManager.close();

最佳答案

回答您的问题:

1) MemberRegistration can inject "log" and "em" directly, is that because the Resources already define them by using @Produces annotation?

是的。 @Inject 仅适用于 CDI 已知的类型(通过类路径扫描发现或通过 @Produces 手动声明)。因此,如果没有将 EntityManagerLogger 定义为 CDI 托管 bean 的 Resources 类,通过 @Inject 进行注入(inject)将无法工作。

顺便说一句。详情您可以阅读 cdi-spec-1.2 - PDF版本有170页长,不算大,但也不算短。

2) So how the transaction is committed and closed?

...您甚至在代码中添加了有效的注释:@Stateless 注释消除了手动事务划分的需要。有关详细信息,请阅读有关 EJB 中的 CMT 事务的内容。

老实说,我同意@JBNizet。看到您提出这样的问题(尤其是第一个问题)真是令人失望,而您只需快速测试即可立即回答这些问题。

关于java - CDI 注入(inject)和 JPA EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611593/

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