0

データベースからエンティティのリストを削除したい。 List<LetterEntity> letterToDel- エンティティのリスト。私はさまざまな方法でこのリストを削除しようとしました。

  1. 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 に答える