2016-02-24 5 views
0

Я вижу два класса: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

1. Что говорит ваш тест? 2. Весь смысл EJB заключается в том, что они обрабатывают транзакции для вас. Вы даже прокомментируете свой код, объясняя это. –

+0

Без @Stateless это не сработает, не так ли? Изучение этого нового материала. – user697911

ответ

0

Ответы на вопросы:

1) MemberRegistration могут ввести «войти» и «эм» непосредственно, является то, что поскольку ресурсы уже определить их с помощью @Produces аннотацию?

Да. @Inject будет работать только для типов, которые известны для CDI (обнаруживаются с помощью сканирования по классам или объявляются вручную через @Produces). Таким образом, без вашего класса Resources, который определяет EntityManager и Logger как управляемые bean-носители CDI, инъекция через @Inject не будет работать.

BTW. Для получения дополнительной информации вы можете прочитать cdi-spec-1.2 - PDF-версия - 170 страниц в длину, не такая большая, но и не очень короткая.

2) Итак, как сделка совершена и закрыта?

... вы даже иметь действительный комментарий в коде: @Stateless аннотаций устраняет необходимость в ручной операции демаркации. Подробности читайте о транзакциях CMT в EJB.

Честно говоря, я согласен с @JBNizet. Неутешительно видеть, что вы задаете такие вопросы (особенно первый), на которые можно ответить сразу же с помощью простого теста.