3

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か?

4

3 に答える 3

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

さよなら

于 2011-06-21T16:56:48.947 に答える
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();
}
于 2011-11-09T09:20:50.840 に答える
2

JPA には、すべての機能を削除する機能がありません。(JQL でなくても!)

少なくとも次の 3 つの方法しかありません。

ところで:AspectJを使用してdeleteメソッドを添付していると思われます。- これを行うことはできますが (私にはわかりませんが、Entity クラスに静的メソッドを直接追加してみませんか)、Roo が生成した aj ファイルに触れてはなりません。

于 2011-04-14T08:46:22.850 に答える