2014-02-18 2 views
0

Я столкнулся с фрагментом кода, в котором класс реализации bean-компонента имеет аннотацию @TransactionManagement(TransactionManagementType.BEAN), в которой методы аннотируются с CMT @TransactionAttribute. Действительно ли? Может ли EJB с сохранением BMT использовать аннотацию транзакций CMT? Каким будет поведение во время выполнения?Можно ли аннотировать метод с @TransactionAttribute в BMT EJB?

Хотя javadoc http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttribute.html говорит, что «Он может быть указан только в случае, если используется транзакционная демаркация, управляемая контейнером». Указание на нее не вызывает ошибки компиляции. Означает ли это, что jvm просто игнорирует его во время выполнения?

@Stateless(mappedName = "Abc") 
@Remote("AbcRemote.class") 
@Local("AbcLocal.class") 
@TransactionManagement(TransactionManagementType.BEAN) 
public class AbcBean implements AbcLocal, AbcRemote{ 

    @Resource 
    private UserTransaction utx; 

    @PersistenceUnit 
    private EntityManagerFactory emf; 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public Abc getAlpbabets(String name) { 
     EntityManager em = null; 
     try { 
      em = emf.createEntityManager(); 
     } 
     catch (RuntimeException re) { 

      throw re; 
     } 
     finally { 

     } 
    } 
} 

ответ

0

Если вы используете CMT, то @TransactionAttribute(TransactionAttributeType.REQUIRED) бы сказать контейнер для проверки существующей транзакции и открыть один, если его нет.

Но если вы используете BMT, то это ваша обязанность делать такое, поэтому некому наблюдать аннотацию выше. Поскольку он по-прежнему синтаксически корректен и класс доступен, нет необходимости в JVM, чтобы жаловаться.

Относительно игнорирования аннотаций в ответ на вопрос this question есть подсказка.