2013-06-24 67 views
0

我們正在使用Apache的openJPA。我使用Java反射調用託管bean中的刪除方法。當我嘗試刪除因違反約束而無法刪除的管理對象時,會發生此問題。當我捕獲InvocationTargetException並檢索異常的原因時,它指出沒有全局事務存在回滾。如何從InvocationTargetException中獲取sql異常

Caused by: java.lang.IllegalStateException: No Global Transaction exists to rollback. 
    at com.ibm.ws.tx.jta.UserTransactionImpl.rollback(UserTransactionImpl.java:349) 

如果我越往下看的堆棧跟蹤我可以看到一個SQL例外是因爲違反約束的拋出。

---- Begin backtrace for Nested Throwables 
java.sql.SQLException: [SQL0532] Delete prevented by referential constraint CONSTRAINTNAME in LIBRARY. 

有我才能到SQL異常,所以我可以顯示,因爲它是在另一個表使用DELETE不能進行友好的信息的一種方式。

編輯 - 下面是代碼

public void deleteRowAction(Object list, DataTableTemplate template){ 
     System.out.println("Delete Row"); 

     try{ 

      Object bean = getManagedBean(template.getDataManagerName()); 

      Method methodDelete = getManagedBean(template.getDataManagerName()).getClass().getMethod(template.getDeleteMethod(), 
        Class.forName(template.getTableList_rowItemClassName())); 

      //Map<String, String[]> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap(); 

      methodDelete.invoke(bean, list); 
     } 
     catch(PersistenceException pe){ 
      System.out.println("Persistence Exception Caught"); 
     } 
     catch(NoSuchMethodException nsme){ 
      nsme.printStackTrace(); 
     } 
     catch(InvocationTargetException ite){ 

      logException(ite); 
      FacesMessage message = new FacesMessage(ite.getCause().getMessage()); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      FacesContext context = this.getFacesContext(); 
      context.addMessage(null, message); 
     } 
     catch(IllegalAccessException iae){ 
      iae.printStackTrace(); 
     } 
     catch(ClassNotFoundException cnfe){ 
      cnfe.printStackTrace(); 
     } 
    } 
+0

http://stackoverflow.com/questions/17279050/javafx-bad-logs-invocation-target-exception –

+0

添加圍繞該回滾ocures之前拋出異常的代碼托盤抓(的SQLException)嵌段。可能在你的道對象中。你也可以發佈一些代碼或描述你如何調用刪除方法。 –

+0

我的問題是我無法修改發生回滾的dao對象。我發佈了我稱之爲刪除方法的代碼。 – Doug

回答

0

我們正在使用IBM的Websphere。以下代碼由Websphere自動生成。由於數據限制沒有發生刪除,回滾失敗。這會導致回滾引發異常,導致原始異常丟失。如果我想查看Constraint異常(我們不能這麼做),我將不得不修改這個方法。我們將改爲記錄一條通用錯誤消息。

@Action(Action.ACTION_TYPE.DELETE) 
public String deleteVerificationDocumentCodeTable(
       VerificationDocumentCodeTable verificationDocumentCodeTable) 
       throws Exception { 
    EntityManager em = getEntityManager(); 
       try { 
        utx.begin(); 
        em.joinTransaction(); 
        verificationDocumentCodeTable = em 
          .merge(verificationDocumentCodeTable); 
        em.remove(verificationDocumentCodeTable); 
        utx.commit(); 
       } catch (Exception ex) { 
        try { 
         utx.rollback(); 
        } catch (Exception e) { 
         ex.printStackTrace(); 
         throw e; 
        } 
        throw ex; 
       } finally { 
        em.close(); 
       } 
       return ""; 
} 
0

傳遞您的異常到下面的方法,檢索SQLException遞歸。

try{ 
     .... 
    } catch(PersistenceException pe){ 
     SQLException sqle = translate(pe); 
    } catch(NoSuchMethodException nsme){ 
     SQLException sqle = translate(nsme); 
    } 
    ... 

public SQLException translate(RuntimeException e) { 
    SQLException result = null; 
    Throwable throwable = e; 
    while (throwable != null && !(throwable instanceof SQLException)) { 
     throwable = throwable.getCause(); 
    } 
    if (throwable instanceof SQLException) { 
     System.out.println("Found SQLException...") 
     result = (SQLException) throwable; 
    } 
    return result; 
} 
+0

我試過你的代碼。只有一個原因返回,不存在全局事務來回滾異常。當我嘗試獲取該異常的原因時,返回null。 – Doug

+0

@Doug,如果是的話,你的事務中不會包含'SQLException'。如果引發'PersistenceException',則可以檢索'SQLException'。 – CycDemo

+0

我確實嘗試並捕獲了PersistenceException,但它不在那裏。我想我知道發生了什麼並且發佈了一個答案。如果看起來不正確,請讓我知道。謝謝你的幫助。 – Doug

相關問題