如何为Spring Roo实体实现“全部删除”?

时间:2011-04-14 08:29:12

标签: jpa spring-roo transactional

我正在尝试删除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个查询?

3 个答案:

答案 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();
}