2013-02-20 123 views
0

我想從數據庫中刪除實體列表。 List<LetterEntity> letterToDel - 實體列表。我試圖以多種方式刪除這個列表。JPA EntityManager不刪除實體

  1. 我創建一個事務,並刪除每個實體環
EntityTransaction trx = em.getTransaction(); 
    try { 

     for (LetterEntity l : lettersToDel) { 
     trx.begin(); 
     em.remove(l); 
     em.flush(); 
     trx.commit(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (trx.isActive()) 
      trx.rollback(); 
    } 
  1. 我爲每一個創造新的事務刪除環路

    try { 

     for (LetterEntity l : lettersToDel) { 
     EntityTransaction trx = em.getTransaction(); 
     trx.begin(); 
     em.remove(l); 
     em.flush(); 
     trx.commit(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (trx.isActive()) 
      trx.rollback(); 
    } 

如果1,2沒有例外,但實體不刪除。

  1. 我試圖查詢

    try { 
     for (LetterEntity l : lettersToDel) { 
       em.createQuery("delete from LetterEntity l where l = :letter") 
       .setParameter("letter", l) 
       .executeUpdate(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

刪除實體的情況下3有一個例外:

javax.persistence.TransactionRequiredException: Executing an update/delete query 

我做錯了嗎?

回答

2

代碼應該在執行查詢之前創建一個事務。

try { 
    EntityTransaction trx = em.getTransaction(); 
    trx.begin(); 
     for (LetterEntity l : lettersToDel) { 
       em.createQuery("delete from LetterEntity l where l = :letter") 
       .setParameter("letter", l) 
       .executeUpdate(); 
    trx.commit(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

非常感謝!現在正在工作。 – 2013-02-20 10:24:31

+0

@MaryRyllo非常高興我能幫到你。 – 2013-02-20 10:27:54

0

對於情況3,這是正常的。您需要一個事務來執行更新。 (如果使用Spring,只需在該方法中添加@Transactional註釋)

對於1和2,你是否在trx.rollback();在你最後的聲明中?

+0

不,它不會進入最後的阻止狀態,我不知道爲什麼。下面的解決方案正在工作,但爲什麼用EntityManager刪除不起作用? – 2013-02-20 10:25:08