开发者

How to implement "delete all" for a Spring Roo Entity?

I'm trying to delete all database entries for a Spring Roo entity. When I look at *_Roo_Entity.aj it seems as if there is no "delete all" method. I tried to implement it myself (Licences is the name of the Roo entity. Don't mind the naming. It was reverese engineered from a database and may be changed later):

public static int Licences.deleteAll() {
    return entityManager().createQuery("delete from Licences o").executeUpdate();
}

It compiles just fine but when I call Licences.deleteAll() I get the following exception:

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query (NativeException)

Adding @Transactional doesn't make a difference.

What am I missing here?

Is this approach completely wrong and I need to implement it like this:

    public static void Licences.deleteAll() {
        for (Licences licence : findAllLicenceses()) {
            licence.remove();
        }
    }

This works, but is JPA smart enough to translate this into开发者_开发技巧 a delete from licences query or will it create n queries?


@Transactional doesn't work on static function

change

public static int Licences.deleteAll() {
    return entityManager().createQuery("delete from Licences o").executeUpdate();
}

to

public int Licences.deleteAll() {
    return entityManager().createQuery("delete from Licences o").executeUpdate();
}

https://jira.springsource.org/browse/SPR-5999

Bye


JPA does not have a delete all functionality. (even not with JQL!)

At least there are only three ways:

  • The loop, like you did
  • A JPQL Query see: JPQL Reference: 10.2.9. JPQL Bulk Update and Delete
  • A native SQL Query, but this will cause many problems with Entity Manager caches!

BTW: It seams that you are using AspectJ to attach you delete method. - You can do this (even if I do not know, why not adding the static method direct to the Entity class), but you must not touch the Roo generated aj files!


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜