Если вы хотите стереть ревизию по идентификатору, вы можете получить доступ к таблице 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()
Если вы хотите удалить по параметру, отличному от идентификатора ревизии, просто запросите идентификаторы ревизий в таблице entity_AUD, а затем удалите найденные строки указанным способом.
Имейте в виду, что ревизия может быть связана более чем с 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()
}
person
Steven Spungin
schedule
01.11.2017