2011-01-28 55 views
3

我正在使用JPA toplink-essential,构建REST Web应用程序。如何在servlet级别捕获OptimisticLockException?

我有一个servlet,它找到一个实体,并删除它。

下面的代码,我想我能赶上乐观锁定异常的servlet的水平,但它不是! 而是抛出RollbackException,这就是文档所说的:

但是当我看到Netbean IDE GlassFish日志时,在某处引发了optimisticLockException。这只是没有被我的代码陷入。 (不会被显示在我的系统打印的消息,所以我敢肯定,它在那里不走了。)

我试图导入每包(一个在课程的时间),并与catch子句但两者时间的考验,它即使日志错误显示为“乐观异常”,也不会进入catch块。

import javax.persistence.OptimisticLockException; 
import oracle.toplink.essentials.exceptions.OptimisticLockException; 

所以在OptimisticLockException抛出?????

@Path("delete") 
@DELETE 
@Consumes("application/json") 
public Object planDelete(String content) { 

    try { 
      EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 

      EntityTransaction txn = em.getTransaction(); 
      txn.begin(); 
      jObj = new JSONObject(content); 
      MyBeany bean = em.find(123); 

      bean.setVersion(Integer.parseInt(12345)); 
      em.remove(bean); 


      //here commit!!!!! 
      em.getTransaction().commit(); 
     } 
     catch(OptimisticLockException e) { //this is not caught here :(
      System.out.pritnln("here"); 
      //EntityTransactionManager.rollback(txn); 
      return HttpStatusHandler.sendConflict(); 
     } 
     catch(RollbackException e) { 
      return HttpStatusHandler.sendConflict(); 
     } 
     catch(Exception e) { 
      return HttpStatusHandler.sendServerError(e); 
     } 
     finally { 
      if(em != null) { 
       em.close(); 
      } 
     } 

错误消息:

[TopLink Warning]: 2011.01.28 05:11:24.007--UnitOfWork(22566987) 
--Exception [TOPLINK-5006] 
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException 

    [TopLink Warning]: 2011.02.01 08:50:15.095--UnitOfWork(681660)-- 
javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink 
Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException 

回答

3

不是100%确定,但是可能是因为您正在捕获javax.persistence.OptimisticLockException(注意该包),但是由于引发的异常是oracle.toplink.essentials.exceptions.OptimisticLockException,它没有被捕获?即使异常类的名称相同,它们也不是同一类。

+0

好点。我在上面的代码中捕获了javax.persistence.OptimisticLockException。我改变了我的catch子句来捕获oracle.toplink.essentials.exceptions.OptimisticLockException,但它一直没有捕获。我在帖子中添加了错误消息。它显示了两种类型的包..非常令人困惑 – 2011-01-31 23:52:43

2

我猜想,这是在em.getTransaction().commit();声明抛出。

由于java doc of RollbackExceptioñ如果说:

由持久性提供时抛出EntityTransaction.commit()失败。

我强烈相信的,这是不是你真的使用(因为缺少它不会编译)符合bean.setVersion(Integer.parseInt(12345);)的代码,但我“希望”,真正的代码有同样的问题。

+0

我修正了这个错字,但问题仍然是乐观的锁包没有被捕获。 – 2011-01-31 23:55:45

0

你有没有打过电话entityManager.flush();在你的try/catch块里面?当抛出OptimisticLock异常时,JPA刷新时。

而且你不需要提交你做的方式交易。你可以完成txn.commit();而不是em.getTransaction()。commit();.

我也有类似的情况,我能赶上javax.persistence.OptimisticLockException。在我的情况下,我将ReST端点设置为SSB并注入实体管理器。然后我在另一个SSB上调用另一个方法,该方法也被注入并作为这部分biz逻辑的控制器。此控制器执行flush()并捕获OLEX,并重新抛出剩余端点/ SSB捕获并重试的ApplicationException。使用这种模式,您还需要确保指定TransactionAttributeType.RequiresNew,以便每次重试都发生在新事务中,因为OLEX会使旧事务无效。