繁体   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