Mci*_*anM 0 jsf ejb transactions javabeans bean-managed-transactions
我对 EJB 和 Bean 管理事务都很陌生。在放弃互联网之后,我发现我可以编写一个 EJ 会话 Bean,它以“bean 管理的方式”执行事务,如下所示:
@TransactionManagement(value=TransactionManagementType.BEAN)
@Stateless
public class OperationBean {
@Resource
private UserTransaction userTransaction;
public void operation() {
try{
userTransaction.begin();
Op1();
Op2();
Op3();
userTransaction.commit();
} catch(Exception e){
userTransaction.rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不明白如果 Op3() 抛出异常会发生什么。Op1() 和 Op2() 如何撤消?
另一个问题是如何将其绑定到 JSF?我需要在 JSF 中编写一个表单,将其数据发送到服务器,OperationBean 根据接收到的数据执行 3 个操作。这些操作确实涉及数据库操作(3个更新),单独来看没有意义。
谢谢!
当您调用 时userTransaction.begin()
,只需说 JTA 在数据库级别开始事务。现在,您执行的所有数据修改都在事务内完成。如果一切正常,执行开始userTransaction.commit()
并且数据库修复事务。如果出现问题,您可以调用userTransaction.rollback()
catch 块,数据库会删除您之后所做的所有修改begin()
。
用两个词很难解释数据库事务如何工作,但基本上数据库将事务期间的所有更改与其他客户端隔离,直到调用commit()
或rollback()
并阻止您正在使用的数据的外部更新。
在 JSF 中,您可以创建@ManagedBean
并OperationBean
使用注释将其注入其中@EJB
。你应该得到这样的东西
@ManagedBean
public class Operation {
@EJB
private OperationBean operationBean;
public void doOperation() {
operationBean.operation();
}
}
Run Code Online (Sandbox Code Playgroud)
在你看来
<h:form>
<h:commandButton action="#{operation.doOperation}" value="Do Operation"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
所以你做得对。假设您确实需要 Bean 管理的事务,而不是容器管理的事务。
归档时间: |
|
查看次数: |
3935 次 |
最近记录: |