Mise en veille prolongée - Envers -> Audit / versioning d'un attribut, mais seulement si la valeur modifiée
-
25-09-2019 - |
Question
J'ai un problème avec Hibernate - Envers. J'ai un objet de domaine avec un seul status
attribut vérifié qui peut être l'un des numéros 0,1,2,3,4,5.
@Entity
public class Item {
...
@Audited
private int status;
... other variables, setter/getter, ...
}
Maintenant, tout et Hibernate Envers fonctionne. Création d'un nouvel objet de l'article et l'ajouter à la base de données d'une ligne est insérée dans la table de base de données theItem_AUD
.
Mais maintenant, j'ai un problème avec sa mise à jour. Ma mise à jour dans la mise en œuvre Hibernate Dao ressemble à:
public void updateItem(Item i) {
SessionFactory sessionFac = HibernateUtility.getSessionFactory();
Session s = sessionFac.getCurrentSession();
Transaction trans = s.beginTransaction();
s.update(i);
s.flush();
trans.commit();
}
Sur chaque mise à jour, cela est imprimé sur la console:
Hibernate: update Item set amount=?, description=?, status=? where id=?
Hibernate: insert into REVINFO (REVTSTMP) values (?)
Hibernate: insert into Item_AUD (REVTYPE, status, id, REV) values (?, ?, ?, ?)
Mais le problème est que je veux seulement insérer une ligne dans la REVINFO
et Item_AUD
si le numéro d'état a changé!
Par exemple: je change la description
de l'élément, effectuez la mise à jour avec l'appel updateItem
puis écrire une nouvelle Envers révision des tables de vérification. Mais je ne veux pas ce comportement.
Ce que je veux: que si la valeur de status
est modifié, doit écrire des entrées Envers la base de données dans les tables d'audit
Mais comment puis-je faire?
Cordialement, Tim.
La solution
Pour cela, vous devez étendre AuditEventListener et passer outre ses méthodes.
public class EnversListener extends AuditEventListener {
@Override
public void onPostInsert(PostInsertEvent event) {
Object o = event.getEntity();
if (o instanceof Item) {
Item currentItem = (Item) o;
Item previousItem = findItemById(currentItem.getId());
if(previousItem != null)
if (currentItem.getStatus() != previousItem.getStatus())
super.onPostInsert(event);
} else {
super.onPostInsert(event);
}
}
@Override
public void onPostDelete(PostDeleteEvent event) {
super.onPostDelete(event);
}
@Override
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
super.onPostRecreateCollection(event);
}
@Override
public void onPostUpdate(PostUpdateEvent event) {
super.onPostUpdate(event);
}
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
super.onPreRemoveCollection(event);
}
@Override
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
super.onPreUpdateCollection(event);
}
}
Vous pouvez ajouter des contraintes personnalisées dans les autres méthodes redéfinies selon les besoins. Le chemin d'accès à la classe d'écouteur à l'intérieur hibernate.cfg.xml doit être configuré en conséquence.