【发布时间】: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