簡體   English   中英

CDI注入和JPA EntityManager

[英]CDI Injection and JPA EntityManager

我正在看兩節課:

/ ** *此類使用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”,這是因為資源已經使用@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可以直接注入“ log”和“ em”,這是因為資源已經使用@Produces注釋定義了它們嗎?

是。 @Inject僅適用於CDI已知的類型(通過類路徑掃描發現或通過@Produces手動聲明)。 因此,如果沒有將EntityManagerLogger定義為CDI托管Bean的Resources類,則無法通過@Inject進行注入。

BTW。 有關詳細信息,您可以閱讀cdi-spec-1.2 -PDF版本長170頁,雖然不大,但也不短。

2)那么如何提交和關閉交易?

...甚至在代碼中都有一個有效的注釋: @Stateless注釋消除了手動進行事務划分的需要 有關詳細信息,請閱讀有關EJB中CMT事務的內容。

老實說,我同意@JBNizet。 看到您問這樣的問題(尤其是第一個問題)令人失望,您可以通過快速測試立即回答自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM