ID でリビジョンを消去する場合は、ネイティブ クエリを使用して直接 envers テーブルにアクセスできます。リビジョンへの参照を含む 2 つのテーブルがあります。監査テーブルが従来の _AUD サフィックスを使用していると仮定すると、エンティティ テーブル名をプログラムで見つけることができます。
Kotlin で書かれたスニペットを次に示します。
fun getAuditTableName(em: EntityManager, aClass: Class<*>): String {
return getAuditTableName(em, aClass.name) + "_AUD"
}
fun getEntityTableName(em: EntityManager, aClass: Class<*>): String {
val session = em.unwrap(Session::class.java) as Session
val sessionFactory = session.sessionFactory
val hibernateMetadata = sessionFactory.getClassMetadata(className)
val persister = hibernateMetadata as AbstractEntityPersister
return persister.tableName
}
テーブル名がわかったので、テーブル内の行を削除できます。(これを JPA トランザクション ブロックに入れ、必要に応じてコンテンツを置き換え、プロバイダーの SQL を調整します)。したがって、MyEntityClass と myRevisionId が与えられた場合、次のようなことができます。
val em:EntityManager = getEntityManager()
val auditTableName = getAuditTableName(MyEntityClass::class.java)
em.createNativeQuery("delete from `$auditTableName` where REV=${myRevisionId}").executeUpdate()
em.createNativeQuery("delete from REVINFO where REV=${myRevisionId}").executeUpdate()
リビジョン ID 以外のパラメーターで削除する場合は、entity_AUD テーブルでリビジョン ID を照会し、見つかった行を前述の方法で削除します。
RevisionId は複数のエンティティに関連付けることができ、前のメソッドではすべてのエントリが削除されることに注意してください。単一のエンティティのリビジョンを削除するには、エンティティの ID とエンティティのキー フィールド名が必要です。
フィールド名を動的に取得するためのコードは次のとおりです。
fun getEntityKeyNames(em: EntityManager, entityClass: Class<*>): List<String> {
val session = em.unwrap(Session::class.java) as Session
val sessionFactory = session.sessionFactory
val hibernateMetadata = sessionFactory.getClassMetadata(entityClass.name)
val persister = hibernateMetadata as AbstractEntityPersister
return persister.keyColumnNames.toList()
}