我有一个带有客户端容器,EJB容器(业务层和数据访问层)的3层应用程序。我想使用BMT在我的客户端进行交易。我在EJB容器上的EJB都在使用CMT。
但我不确定这是否真的有效,因为客户端不在EJB容器中工作。客户端使用Context对象注入EJB容器的EJB,这似乎可以正常工作。我将我的客户端类声明为:
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
这是对的吗?我想我的GUI使用的客户端类必须是单例。
我有这些对象:
private Context jndiCntx;
private UserTransaction tx;
@PostConstruct
public void initialize() throws Exception {
jndiCntx = new InitialContext();
tx = (UserTransaction) jndiCntx.lookup("java:comp/UserTransaction");
tx.begin();
}
此PostConstruct初始化事务。 这是我得到NullPointerException(在commitOrder()中):
@Override
public void commitOrder() throws ApplicationException {
try {
tx.commit();
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException("", "commitOrder() failed!");
}
}
@Override
public void cancelOrder() throws ApplicationException {
try {
tx.rollback();
} catch (Exception e) {
throw new ApplicationException("", "cancelorder() failed!");
}
}
所以看起来我没有得到UserTransaction对象。我对使用上下文和事务的不同方式感到有些困惑。我究竟做错了什么?顺便说一下:使用TransactionManager与TransactionManager和使用UserTransaction有什么区别?