[英]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
手動聲明)。 因此,如果沒有將EntityManager
和Logger
定義為CDI托管Bean的Resources
類,則無法通過@Inject進行注入。
BTW。 有關詳細信息,您可以閱讀cdi-spec-1.2 -PDF版本長170頁,雖然不大,但也不短。
2)那么如何提交和關閉交易?
...甚至在代碼中都有一個有效的注釋: @Stateless
注釋消除了手動進行事務划分的需要 。 有關詳細信息,請閱讀有關EJB中CMT事務的內容。
老實說,我同意@JBNizet。 看到您問這樣的問題(尤其是第一個問題)令人失望,您可以通過快速測試立即回答自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.