2011-06-09 106 views
1

當我嘗試刪除ExternalDataStorage此查詢拋出一個約束衝突異常約束名爲null .ExternalDataStorage沒有關係映射關於它。查詢首先檢查ExternalTask​​s其中包含ExternalDataStorage(將被刪除)在ExternalTask​​的externalsources列表並從列表中移除,如果列表爲空,則移除externaltask並最終移除ExternalDataStorage實體(目標實體)。JPA @manytomany單向映射

 public boolean deleteExternalDataStorage(Long sid) { 
    EntityManager em = getEntityManager(); 
    EntityTransaction et = em.getTransaction(); 
    try { 
     et.begin(); 
     ExternalDataStorage s = em.find(ExternalDataStorage.class, sid); 
     List<ExternalTask> tasks = (List<ExternalTask>) em.createQuery("SELECT t FROM ExternalTask t ").getResultList(); 
     for (ExternalTask t : tasks) { 
      if (t.getExternalSources().contains(s)) { 
       t.getExternalSources().remove(s); 
       if (t.getExternalSources().isEmpty()) { 
        em.remove(t); 
       } else { 
        t = em.merge(t); 
       } 
      } 
     } 
     em.remove(s); 
     et.commit(); 
     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 


    } finally { 
     if (et.isActive()) { 
      et.rollback(); 
     } 
    } 
    return false; 
} 

@Entity 公共類ExternalTask​​實現Serializable {

@ManyToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}) 
@JoinTable(name = "ExternalTask_ExternalSource", joinColumns = @JoinColumn(name = "TID"), inverseJoinColumns = @JoinColumn(name = "EXID")) 
private List<ExternalDataStorage> externalSources =new ArrayList<ExternalDataStorage>(); 


@ManyToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}) 
@JoinTable(name = "ExternalTask_Archive", joinColumns = @JoinColumn(name = "TID"), inverseJoinColumns = @JoinColumn(name = "AID")) 
protected List<Archive> archives=new ArrayList<Archive>(); 


@ManyToOne 
private User ownerUser; 

_編輯_ __ _ __ _ __ _ __ _ __ _ ___

更改查詢有點爲刪除的情況下,但問題仍然存在

EntityManager em = getEntityManager(); 
     EntityTransaction et = em.getTransaction(); 
     try { 
      et.begin(); 
      ExternalDataStorage s = em.find(ExternalDataStorage.class, sid); 
      List<ExternalTask> tasks=(List<ExternalTask>) em.createQuery("SELECT t FROM ExternalTask t ").getResultList(); 
      for(ExternalTask t:tasks) { 
       if(t.getExternalSources().contains(s)){ 
       t.getExternalSources().remove(s); 
        t= em.merge(t); 
        if(t.getExternalSources().isEmpty()){ 
         em.remove(t); 
        } 
       } 
      }     
      em.remove(s); 
      et.commit(); 
      return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 


     } finally { 
      if (et.isActive()) { 
       et.rollback(); 
      } 
     } 
     return false; 
    } 

這是例外

**377249 [http-8080-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null 
377249 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 delete from ExternalSource where EXID=6 was aborted. Call getNextException to see the cause. 
377249 [http-8080-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23503 
377249 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: update or delete on table "externalsource" violates foreign key constraint "fk755287f526733b01" on table "externaltask_externalsource" 
    Detail: Key (exid)=(6) is still referenced from table "externaltask_externalsource". 
377250 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) 
     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) 
    at com.endersys.itap.ui.module.storage.StorageManager.deleteExternalDataStorage(StorageManager.java:351) 
    at com.endersys.itap.ui.module.storage.ExternalDataStorageEditorBean.delete(ExternalDataStorageEditorBean.java:73) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:172) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) 
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:78) 
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:57) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:127) 
    at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55) 
    at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329) 
    at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304) 
    at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261) 
    at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:474) 
    at org.apache.my**faces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:183) 
    at org.apache.myfaces.webapp.MyFacesServlet.service(MyFacesServlet.java:103) 
    at com.endersys.itap.ui.MyFacesServletWrapper.service(MyFacesServletWrapper.java:34) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) 
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at com.endersys.itap.ui.MenuFilter.doFilter(MenuFilter.java:169) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:636) 

引起:java.sql.BatchUpdateException :批次條目0從其中EXID = 6被中止的ExternalSource中刪除。調用getNextException來查看原因。 在org.postgresql.jdbc2.AbstractJdbc2Statement $ BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537) 在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328) 在org.postgresql.core.v3。 QueryExecutorImpl.execute(QueryExecutorImpl.java:351) 在org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674) 在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 的組織。 hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) ... 55更多 javax.persistence.RollbackException:在org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)提交事務 時出錯。 在com.endersys.itap.ui.module.storage.StorageManager.deleteExternalDataStorage(StorageManager.java:351) 在com.endersys.itap.ui.module.storage.ExternalDataStorageEditorBean.delete(ExternalDataStorageEditorBean.java:73) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect中.Method.invoke(Method.java:616) at org.apache.el.parser.AstValue.invoke(AstValue.java:172) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 在com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpres sion.java:68) 在javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:78) 在org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:57) 在javax.faces。 component.UICommand.broadcast(UICommand.java:127) at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent。的java:55) 在org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329) 在org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304) 在org.ajax4jsf.component.AjaxViewRoot。 processPhase(AjaxViewRoot.java:261) 在org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:474) 在org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32) 在有機apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76) at javax.faces.webapp.FacesServlet.service(FacesServlet。 java:183) at org.apache.myfaces.webapp.MyFacesServ let.service(MyFacesServlet.java:103) at com.endersys.itap.ui.MyFacesServletWrapper.service(MyFacesServletWrapper.java:34) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341) at org.apache.catalina。 core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilt er.java:290) 在org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 在org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 在org.apache.catalina。 core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.endersys.itap.ui.MenuFilter.doFilter(MenuFilter.java: 169) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina。 core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves。 ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) 在org.apache.tomcat。 util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:636) 原因:org.hibernate.exception.ConstraintViolationException:無法在org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 處執行JDBC批量更新 (位於org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper。 java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) at org.hibernate.engine.ActionQueue。 executeActions(ActionQueue.java:144) 在org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 在org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 在有機hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 在org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 在org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) ... 47更多 原因:java.sql.BatchUpdateException:批次條目0從EXS = 6被中止的ExternalSource中刪除。調用getNextException來查看原因。 在org.postgresql.jdbc2.AbstractJdbc2Statement $ BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537) 在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328) 在org.postgresql.core.v3。 QueryExecutorImpl.execute(QueryExecutorImpl.java:351) 在org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674) 在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 的組織。 hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) ...... 55多個

And this is constraint on table 



ALTER TABLE externaltask_externalsource 
    ADD CONSTRAINT fk755287f526733b01 FOREIGN KEY (exid) 
     REFERENCES externalsource (exid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION; 
+0

ExternalSource而ExternalDataStorage是同一個實體存在hell.Sorry ... – ayengin 2011-06-09 20:52:16

回答

0

我添加連接提取和問題解決。

public boolean deleteExternalDataStorage(Long sid) { 
     EntityManager em = getEntityManager(); 
     EntityTransaction et = em.getTransaction(); 

     try { 
      et.begin(); 
      ExternalDataStorage s = em.find(ExternalDataStorage.class, sid);    
      List<ExternalTask> tasks=(List<ExternalTask>) em.createQuery("SELECT t FROM ExternalTask t join fetch t.externalSources").getResultList(); 
      for(ExternalTask t:tasks) { 
       if(t.getExternalSources().contains(s)){ 
         t.getExternalSources().remove(s); 
        if(t.getExternalSources().isEmpty()){ 
         em.remove(t); 
        } 
       } 
      }  
      em.remove(s); 
      et.commit(); 
      return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      if (et.isActive()) { 
       et.rollback(); 
      } 

     } finally { 

     } 
     return false; 
    } 
1

搜尋有點難以理解這個問題。我假設你正在尋找externalsources在刪除externaltask實體時被刪除。我認爲你需要在你的級聯設置中包含REMOVE,或者基本上級聯= {CascadeType.ALL}

編輯: 想想我找到了你的情況的答案。當多對多連線時,PP會在db上創建一個完整性約束(我認爲你正在從實體中對模式進行自動生成)。

在這種情況下,SOURCE_TASK表中源與任務之間的關係被保持,與SOURCE表有外鍵關係。所以當你試圖從SOURCE表中刪除某些東西時,底層數據庫會給出一個sql異常。我能夠重現您的問題。

解決方案: 我所做的是我刪除了外鍵約束,我能夠很好地移除源實體。

正如我最初指出的任務來源清除 如果您使用Cascade.ALL刪除TASK實體,它應該刪除各處的條目。

更新:我想在你的SOURCE對象中處理平等的方式有一些東西。如果至少找到一個「相等」的對象,則List.contains(o)將成立。 List.remove(o)將刪除「等於」o的第一個對象。所以我敢打賭,列表中有多個「平等」對象。

+0

@OpenSource對不起,我的問題是不明確的。我wantto刪除ExternalSource(ExternalDataStorage)的名稱,但如果有任何任務只包含這externalsource在它列出我想要刪除此任務也。 – ayengin 2011-06-09 20:55:46

+0

順便刪除一個ExternalTask​​ musnt刪除任何externalSource。 – ayengin 2011-06-09 20:58:33

+0

爲您的第二個評論,您應該使用CascadeType.ALL刪除級聯。對於第一個評論,讓我做一個小程序並回復你。在此期間,您的異常發生在哪裏? - 堆棧跟蹤。 – OpenSource 2011-06-10 00:19:38