Mise en veille prolongée - Envers -> Audit / versioning d'un attribut, mais seulement si la valeur modifiée

StackOverflow https://stackoverflow.com/questions/4602684

  •  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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top