CDI @TransactionAttribute для бобов - PullRequest
3 голосов
/ 02 августа 2011

Я экспериментирую с CDI на тестовом приложении.У меня есть DAO, который внедряет контейнер, управляемый JTA контекст постоянства, как это:

public class TestDAO implements Serializable {
    @PersistenceContext
    private EntityManager entityManager;

    public void insertEntity(Test test) {
        entityManager.persist(test);
    }
}

Теперь у меня есть компонент управления CDI, как это:

@Named
@SessionScoped
public class TestController implements Serializable {
    @Inject
    private TestDAO testDAO;

    public void finishGame() {
        testDAO.insertEntity(new Test(1, 2, 3));
    }
}

Если я запускаюпри этом я получаю сообщение об ошибке в DAO при попытке вставить объект, потому что нет активной активной транзакции.Все идет нормально.Я могу решить эту проблему, сделав бин контроллера состоянием EJB, которое обернет finishGame() в транзакции.

Но давайте предположим, что я не хочу EJB.В качестве теста я пометил finishGame() аннотацией @TransactionAttribute, и она сработала (bean-компонент контроллера НЕ является EJB).Итак, мой вопрос: как это работает?CDI определяет @TransactionAttribute для простых бобов?Я знаю, что Seam Persistence Module делает это, но я им не пользуюсь.На самом деле я добавил его в проект, но потом удалил, потому что получил неловкие исключения.

Может кто-нибудь разобраться в моем замешательстве?Действительно ли CDI определяют @TransactionAttribute для простых бобов?

PS У меня другой вопрос.Я вижу тенденции переносить все аннотации EJB на простые бины.Так станет ли EJBs устаревшим в будущем?Я имею в виду, я видел в JIRA, что @TransactionAttribute будет добавлено в будущем для простых компонентов (задача все еще не решена).Так разве это не затмевание EJB-компонентов, своего рода дублирующая функциональность?

С уважением, Петар

1 Ответ

3 голосов
/ 03 августа 2011

Вам нужно определить перехватчик транзакции.Определите аннотацию @Transactional и перехватите все методы, аннотированные ею.В перехватчике достаточно начать, зафиксировать или откатить транзакцию.Ситуация усложняется, когда в картину входит распространение транзакций.Поэтому убедитесь, что у Seam нет ничего готового к использованию http://seamframework.org/Seam3/PersistenceModule

...