Я вижу два класса:CDI Injection и JPA EntityManager
/** * Этот класс использует CDI псевдоним Java EE ресурсы, такие как контекст настойчивость, чтобы КДИ бобы * */
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 может непосредственно вводить «журнал» и «em», потому что ресурсы уже определяют их с помощью аннотации @Produces? Без класса Resources будет ли класс MemberRegistration работать? Я пытаюсь понять, связаны ли эти два класса и как работает CDI.
2) В методе регистра MemberRegistration используется только метод «em.persist()». Полный поток использования EntityManager выглядит следующим образом. В примере приложения я не видел методов «commit()» и «close()». Итак, как транзакция совершена и закрыта?
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(SomeObject);
entityManager.getTransaction().commit();
entityManager.close();
1. Что говорит ваш тест? 2. Весь смысл EJB заключается в том, что они обрабатывают транзакции для вас. Вы даже прокомментируете свой код, объясняя это. –
Без @Stateless это не сработает, не так ли? Изучение этого нового материала. – user697911