我想从数据库中删除实体列表。
List<LetterEntity> letterToDel
- 实体列表。我试图以多种方式删除此列表。
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();
}
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中没有例外,但实体没有删除。
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
我做错了什么?
答案 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();在你的最后陈述?