我遇到了一段代码,其中bean实现类具有@TransactionManagement(TransactionManagementType.BEAN)
注释,其中方法使用CMT @TransactionAttribute
进行注释。有效吗?
具有BMT持久性的EJB是否可以使用CMT事务注释?运行时的行为是什么?
虽然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 :(得分:0)
如果您使用CMT,那么@TransactionAttribute(TransactionAttributeType.REQUIRED)
将告诉容器检查现有交易,如果没有,则打开一个。
但是如果你使用BMT,那么你有责任做这样的事情,所以没有人去观察上面的注释。由于它在语法上仍然正确且类可用,因此JVM无需抱怨。
关于忽略注释,this question的答案中有一个提示。