10
votes

Comment supprimer des entrées de ma table d'audit?

Je travaille actuellement avec Hibernate Envers.

Comment supprimer des entrées dans la table d'audit lié à l'entité que je souhaite supprimer? Mon entité n'a aucune relation avec d'autres entités. P>

J'ai compris que je dois le faire dans OnpostDelete Code> Méthode de mon auditeur personnalisé: P>

import org.hibernate.envers.event.AuditEventListener;
import org.hibernate.event.PostCollectionRecreateEvent;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PreCollectionRemoveEvent;
import org.hibernate.event.PreCollectionUpdateEvent;

public class MyListener extends AuditEventListener {

  ...
  @Override
  public void onPostDelete(PostDeleteEvent arg0) {
    // TODO Auto-generated method stub
    super.onPostDelete(arg0);
  }
  ...

}


0 commentaires

4 Réponses :


0
votes

Les entrées d'audit sont typiquement ajoutées, non supprimées, même lorsque l'entité associée est supprimée afin que je ne pense que l'API d'envoi fournit un support pour cela.

Maintenant, si vous souhaitez vraiment supprimer les entrées d'entités supprimées (ce genre de défaite le but de l'audit), vous pouvez peut-être retarder cela un peu et au lieu de supprimer les entrées à la suppression du temps, exécutez une requête native quotidienne, par exemple chaque nuit.


2 commentaires

Merci Pascal pour votre temps. Comme vous l'avez dit, on dirait que API API ne fournit pas de soutien à cela. Après avoir examiné plusieurs forums, j'ai trouvé un indice. Je devrai écrire une requête HQL: "Supprimer de Full.Package.name.user_ud u Où u.id =: userid" C'est à moitié travaillant parce que je suis maintenant coincé avec un problème d'hibernate ...


Il vous suffit d'utiliser un accesseur privé pour modifier le Select à Supprimer, je viens de publier une solution de travail sans SQL natif



4
votes

OK, je suis 50% fait avec ceci pour ceux qui veulent savoir.

Merci au créateur d'envers Hibernate, Adam Warski, je cite:

"ID" est un mot clé Hibernate pour l'ID d'une entité, quels que soient les noms; En cas d'entités d'audit, l'ID est composite et s'appelle "originId". Essayez: xxx

Mais maintenant, je voudrais également supprimer des entrées liées à la table d'audit dans ma table Revinfo.

Si quelqu'un a un indice, faites le moi savoir.


0 commentaires

3
votes

Cela fonctionne entièrement à moi et aucune requête native requise xxx


1 commentaires

J'ai aussi dû supprimer "commander par. *" dans la requête SELECT, alors cela fonctionne aussi pour moi. La commande par a été probablement ajoutée dans une version ultérieure des envois.



2
votes

Si vous souhaitez effacer une révision par ID, vous pouvez accéder directement à la table d'envoi à l'aide d'une requête native. Il existe 2 tables contenant des références à la révision. En supposant que votre table d'audit utilise le suffixe de contrôle conventionnel, vous pouvez trouver le nom de la table d'entité par programme.

Voici quelques extraits écrites à Kotlin: P>

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()
}


0 commentaires