簡體   English   中英

JPA EntityManager不刪除實體

[英]JPA EntityManager not removing entities

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

  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

我做錯了什么?

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

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();
    }

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

對於1和2,你進入trx.rollback(); 在你的最后陳述?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM