JPA EntityManager不删除实体

时间:2013-02-20 10:02:51

标签: java jpa entities

我想从数据库中删除实体列表。 List<LetterEntity> letterToDel - 实体列表。我试图以多种方式删除此列表。

  1. 我创建了一个事务并删除了循环中的每个实体
  2.     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. 我为每个循环删除创建新事务
    2. 
          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. 我尝试删除带查询的实体
      2. 
            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 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:0)

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

对于1和2,你进入trx.rollback();在你的最后陈述?