Если вы хотите стереть ревизию по 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()
Если вы хотите удалить с помощью параметра, отличного от revisionID, просто запросите revisionIds в таблице entity_AUD, а затем удалитенайдено строк указанным способом.
Имейте в виду, что revisionId может быть связан с более чем 1 сущностью, и все записи будут удалены в предыдущем методе.Чтобы удалить ревизию для отдельной сущности, вам понадобится идентификатор сущности и ключевые имена полей сущности.
Вот код для динамического получения имени поля:
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()
}