2

この質問はすでにここで議論されていましたが、私の問題は解決しませんでした。

名前などの文字列情報と、文字列の電子メールアドレスのリストを持つ単純な監査済みクラス Person を作成してみましょう。今、特定の人物をそのすべてのリビジョンとともにデータベースから削除したいと考えています。これは Envers の一般的な使用例ではありませんが、私のプロジェクトにとっては非常に重要です。次のようなものを使用できることを理解しています:

「full.package.name.Person_AUD u から削除 u.originalId.id = :personid」

ただし、この関係には制約がないため、メールのテーブルでこの人物に関連するレコードは削除されません。それとも私は何か間違ったことをしていますか?

REVINFO テーブルからレコードを削除することも考えていました (REVINFO テーブルとの関係について監査テーブルには制約があります) が、これは安全ではありません。 .

私の質問は次のとおりです。任意の人のすべての監査テーブルからすべてのレコードを簡単に削除する方法はありますか?

4

2 に答える 2

1

This is fully working to me, and no native query is required

AuditQuery aq = auditReader.createQuery()
                   .forRevisionsOfEntity( ErpEmploye.class, true, false);       
 aq.add( AuditEntity.id().eq( employe.getCodeId() ) );
 aq.add( AuditEntity.relatedId("period").eq( erpPeriod.getCodeId() ) );
 List result =  aq.getResultList();//parameters must be added, this call is required
 if (result.size()>0){
    Query query = (Query) PrivateAccessor.invokePrivateMethod( aq, "buildQuery", new Object[0]);
    String queryString = (String) PrivateAccessor.getPrivateField( query, "queryString", true );
    PrivateAccessor.setPrivateField( query, "queryString", queryString.replace("select e__ from", "delete from"), true );
    getDAO().executeQuery(query);//transaction required             
}
于 2014-04-20T15:10:34.727 に答える
0

これは hibernate が提供する機能ではなく、自分で削除しているためです。次に、同様のクエリを使用して明示的にすべてのテーブルからデータを削除する必要があります。

 delete from full.package.name.Person_AUD u where u.originalId.id = :personid

 delete from full.package.name.Emails u where u.personId = :personid
于 2012-08-16T17:27:52.337 に答える