【问题标题】:CDI Injection and JPA EntityManagerCDI 注入和 JPA EntityManager
【发布时间】:2016-06-07 07:12:12
【问题描述】:

我看到两个课程:

/** * 此类使用 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);
    }
}

我对此有 2 个问题:

1) MemberRegistration 可以直接注入“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.你的测试说什么? 2. EJB 的全部意义在于它们为您处理事务。您甚至可以对您的代码进行注释来解释它。
  • 没有@Stateless,它不会工作,对吧?学习这些新东西。

标签: java hibernate jpa jboss cdi


【解决方案1】:

回答您的问题:

1)MemberRegistration可以直接注入“log”和“em”,是不是因为Resources已经用@Produces注解定义了?

是的。 @Inject 仅适用于 CDI 已知的类型(通过类路径扫描发现或通过 @Produces 手动声明)。因此,如果没有您的 Resources 类,该类将 EntityManager 和 Logger 定义为 CDI 托管 bean,则通过 @Inject 进行注入将不起作用。

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

2) 那么事务是如何提交和关闭的呢?

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

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

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 2019-06-15
    • 2017-03-21
    • 2016-01-30
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2011-01-22
    相关资源
    最近更新 更多