2014-02-18 53 views
0

我遇到了一段代码,其中bean实现类具有@TransactionManagement(TransactionManagementType.BEAN)注释,其中方法用CMT @TransactionAttribute进行注释。有效吗? 具有BMT持久性的EJB可以使用CMT事务注释吗?运行时的行为是什么?是否可以在BMT EJB中使用@TransactionAttribute注释方法?

尽管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的答案中有提示。

相关问题