Java EJB3-处理回滚异常
我有一个EJB3应用程序,它由一些用于访问数据库的EJB组成,并通过会话Bean作为web服务公开 现在我需要找出两件事: 1) 有没有办法阻止SQL异常导致web服务抛出SOAP错误?事务由容器处理,当前sql异常导致抛出回滚异常,因此事务将被回滚(期望的行为),web服务将抛出错误(不期望) 2) 我希望扩展webservice,以便能够接收实体列表,并使用会话bean来持久化每个实体。但是,我希望每个实体都在自己的事务中执行,这样,如果一个实体失败,其他实体就不会受到影响(同样,web服务也不应该出错) 对于(1)我尝试捕获RollBackException,但我假设它被抛出到另一个线程的某个地方,因为从未到达catch块。我假设对于(2)我需要研究用户事务,但首先希望容器来管理它,其次不知道如何强制使用用户事务 谢谢。For(1):调试代码,找出引发异常的位置和原因。然后在那里处理异常 对于(2):使用beginTransaction()和commit()包装每个实例Java EJB3-处理回滚异常,java,transactions,jakarta-ee,persistence,ejb-3.0,Java,Transactions,Jakarta Ee,Persistence,Ejb 3.0,我有一个EJB3应用程序,它由一些用于访问数据库的EJB组成,并通过会话Bean作为web服务公开 现在我需要找出两件事: 1) 有没有办法阻止SQL异常导致web服务抛出SOAP错误?事务由容器处理,当前sql异常导致抛出回滚异常,因此事务将被回滚(期望的行为),web服务将抛出错误(不期望) 2) 我希望扩展webservice,以便能够接收实体列表,并使用会话bean来持久化每个实体。但是,我希望每个实体都在自己的事务中执行,这样,如果一个实体失败,其他实体就不会受到影响(同样,web服务
不,您可以使用容器管理的事务来完成所有这一切(这当然更可取,因为管理事务是一件痛苦的事情) 该解决方案的要点是创建第二个EJB,该EJB仅具有本地接口和所需的事务语义。然后,web服务直接调用的“公共”ejb通过其本地接口调用第二个ejb来执行实际工作 大致如下:
public class MyPublicEjb {
@EJB
private MyPrivateImpl impl;
public void doSomething() {
try {
impl.doSomething();
} catch(TXRolledBack) {
// handle rollback ...
}
}
}
我知道这看起来有点难看,但相信我,这比直接操作事务要好得多。正如我所说的——异常似乎是从一个单独的线程抛出的——或者至少是在我的代码完成它所做的事情之后。具体来说,在抛出异常时,我的代码已经将控制权返回给了应用程序服务器,也就是说,不可能捕捉到它。在第二点上,我非常清楚这类问题的一般解决方案,只是不知道如何在EJB3中实现。如何使用EntityManager开始和提交事务?如何获得未绑定到容器管理事务的EntityManager?注意,私有EJB需要@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释(否则,我们的情况与之前相同,因为事务的作用域在调用EJB上),这是有效的。谢谢
public class MyPublicEjb {
@EJB
private MyPrivateImpl impl;
public void doSomething() {
try {
impl.doSomething();
} catch(TXRolledBack) {
// handle rollback ...
}
}
}