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);
}
...
}
4 Réponses :
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 em> pense em> que l'API d'envoi fournit un support pour cela. p>
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. p>
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
OK, je suis 50% fait avec ceci pour ceux qui veulent savoir.
Merci au créateur d'envers Hibernate, Adam Warski, je cite: P>
"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: p> blockQuote>
xxx pré> Mais maintenant, je voudrais également supprimer des entrées liées à la table d'audit dans ma table Revinfo. P>
Si quelqu'un a un indice, faites le moi savoir. p> p>
Cela fonctionne entièrement à moi et aucune requête native requise forte>
J'ai aussi dû supprimer "commander par. *" Code> 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.
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()
}