0

我想从数据库中删除实体列表。 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

我做错了什么?

4

2 回答 2

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();
    }
于 2013-02-20T10:10:11.703 回答
0

对于情况 3,这是正常的。您需要一个事务来执行更新。(如果你使用Spring,只需在方法中添加@Transactional注解即可)

对于 1 和 2,你是否进入 trx.rollback(); 在你最后的声明中?

于 2013-02-20T10:21:21.450 回答