2016-02-19 168 views
0

在我的Java應用程序中,我試圖在一個有子對象的父對象上運行cascade deleteHibernate中的級聯刪除:從表中刪除什麼命令?

當,當我運行的應用程序,我得到以下錯誤:

java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint violated - child record found 

...我已經尋找這個錯誤,here它指出,這是由於:

You tried to DELETE a record from a parent table (as referenced by a foreign key), but a record in the child table exists. 

我需要刪除全部子表第一個?我認爲級聯刪除的想法是它自動

代碼:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myclasses"); 
       EntityManager em = entityManagerFactory.createEntityManager(); 
       Session session = em.unwrap(Session.class); 

    Transaction transaction = session.beginTransaction(); 
      try { 

       String hqlDelete = "DELETE FROM product WHERE price='PRICED'"; 
       Query queryDelete = session.createQuery(hqlDelete); 
       queryDelete.executeUpdate(); 

       transaction.commit(); 
      } catch (Throwable t) { 
       transaction.rollback(); 
       throw t; 
      } 
+0

你能粘貼兩個實體類? –

+0

是什麼讓你覺得你正在運行'級聯刪除'? –

+0

,因爲在我的實體中有各種級聯= CascadeType.ALL註釋?對不起,我對hibernate非常陌生 – java123999

回答

3

你要做的就是所謂的bulk delete。它是高性能的,但也有一些缺點:

  • 不尊重級聯
  • 不能使用連接(什麼是有些邏輯)

可以之前刪除兒童的實體,這將是最高性能解決方案。

也有另一種解決方案,利用Cascade選項(實際上它是反模式如果許多行應該被刪除) - 你可以在你想刪除,並呼籲Session.delete()每個實體迭代。

更新

提供了您擁有和實體@OneToMany協會之間ParentChildren,你可以簡單地要求所有Children這將受到影響,並事先將其刪除:

session 
    .createQuery("DELETE FROM Children c WHERE EXISTS (SELECT p FROM Parent p WHERE p.price='PRICED' AND c IN p.children)") 
    .executeUpdate(); 

然後你就可以放心地刪除您的Parent實體:

session 
    .createQuery("DELETE FROM Parent p WHERE p.price='PRICED'") 
    .executeUpdate(); 

更簡潔,但方式不太高性能將查詢要刪除所有Parent實體,然後手動刪除它們:

List<Parent> parents = session 
    .createQuery("SELECT p FROM Parent p WHERE p.price='PRICED'"); 
for (Parent parent : parents) { 
    session.delete(parent); 
} 
+0

謝謝,那麼我將如何改變我現有的代碼來使用它? – java123999

+0

@ java123999檢查更新回答 –

+0

我得到錯誤「無法解析每個方法」? – java123999