我們正在使用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();
}
}
http://stackoverflow.com/questions/17279050/javafx-bad-logs-invocation-target-exception –
添加圍繞該回滾ocures之前拋出異常的代碼托盤抓(的SQLException)嵌段。可能在你的道對象中。你也可以發佈一些代碼或描述你如何調用刪除方法。 –
我的問題是我無法修改發生回滾的dao對象。我發佈了我稱之爲刪除方法的代碼。 – Doug