CDI Injection和JPA EntityManager

时间:2016-02-24 19:46:30

标签: java hibernate jpa jboss cdi

我看到两个班级:

/ **  *此类使用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)会员注册可以注入&#34; log&#34;和&#34; em&#34;直接,那是因为资源已经使用@Produces注释定义了它们吗?没有Resources类,MemberRegistration类仍然可以工作吗?我试图了解这两个类是否或如何相关,以及CDI如何工作。

2)在MemberRegistration的注册方法中,只有一个&#34; em.persist()&#34;使用的方法。使用EntityManager的完整流程如下所示。在示例应用程序中,我没有看到方法&#34; commit()&#34;和&#34;关闭()&#34;使用。那么如何提交和关闭交易呢?

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

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  

1)MemberRegistration可以直接注入“log”和“em”,是因为资源已经使用@Produces注释定义了它们吗?

是。 @Inject仅适用于CDI已知的类型(通过类路径扫描发现或通过@Produces手动声明)。因此,如果没有将ResourcesEntityManager定义为CDI托管bean的Logger类,则通过@Inject注入将无效。

顺便说一句。有关详细信息,请阅读cdi-spec-1.2 - PDF版本长170页,不是那么大,但也不会那么短。

  

2)那么交易如何提交和关闭?

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

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