Если вы хотите, чтобы уничтожить пересмотр по идентификатору, вы можете получить доступ к таблице Envers непосредственно с помощью родной запроса. Есть две таблицы, содержащие ссылки на ревизию. Предполагая, что ваша таблица аудита использует обычный суффикс _AUD, вы можете найти имя таблицы сущностей программным путем.
Вот некоторые фрагменты написаны на Котлин:
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, а затем удалите найденные строки таким образом.
Имейте в виду, что versionId может быть связан с более чем 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()
}
Спасибо Паскаль за ваше время. Как вы сказали, похоже, что API Envers не поддерживает эту поддержку. После просмотра нескольких форумов я нашел ключ. мне придется написать запрос HQL: «удалить из full.package.name.User_AUD ˙U где u.id =: Идентификатор_пользователь» Это половина работает, потому что сейчас я застрял с проблемой Hibernate ... –
Вам просто нужно использовать частный аксессуар, чтобы изменить выбор для удаления, я просто опубликую рабочее решение без родного SQL –