我正在尝试删除Spring Roo实体的所有数据库条目。当我查看*_Roo_Entity.aj
时,似乎没有“全部删除”方法。我试图自己实现它(Licences
是Roo实体的名称。不要介意命名。它是从数据库设计的,可以在以后更改):
public static int Licences.deleteAll() {
return entityManager().createQuery("delete from Licences o").executeUpdate();
}
它编译得很好但是当我调用Licences.deleteAll()
时,我得到以下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query;
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query (NativeException)
添加@Transactional
没有任何区别。
我在这里缺少什么?
这种方法是完全错误的,我需要像这样实现它:
public static void Licences.deleteAll() {
for (Licences licence : findAllLicenceses()) {
licence.remove();
}
}
这样做有效,但JPA足够聪明,可以将其转换为delete from licences
查询,还是会创建n
个查询?
答案 0 :(得分:6)
@Transactional不适用于静态功能
变化
public static int Licences.deleteAll() {
return entityManager().createQuery("delete from Licences o").executeUpdate();
}
到
public int Licences.deleteAll() {
return entityManager().createQuery("delete from Licences o").executeUpdate();
}
https://jira.springsource.org/browse/SPR-5999
再见
答案 1 :(得分:2)
JPA没有删除所有功能。 (即使没有使用JQL!)
至少只有三种方式:
BTW:你正在使用AspectJ附加删除方法。 - 你可以这样做(即使我不知道,为什么不直接将静态方法添加到Entity类),但你不能触摸Roo生成的aj文件!
答案 2 :(得分:2)
public static int Licences.deleteAll() {
return new Licences().deleteAllTransactional();
}
@Transactional
private int Licences.deleteAllTransactional() {
if (this.entityManager == null) this.entityManager = entityManager();
return this.entityManager.createQuery("delete from Licences o").executeUpdate();
}