Я экспериментирую с 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-компонентов, своего рода дублирующая функциональность?
С уважением, Петар