Hibernate - envers -> Auditoria / versão de um atributo, mas apenas se o valor foi alterado

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

  •  25-09-2019
  •  | 
  •  

Pergunta

Tenho um problema com o hibernato - envers. Eu tenho um objeto de domínio com apenas um atributo auditado status que pode ser um dos números 0,1,2,3,4,5.

@Entity
public class Item {
    ...
    @Audited
    private int status;
    ... other variables, setter/getter, ...
}

Agora, tudo em Envers e Hibernate está funcionando. Criando um novo objeto de item e adicione -o ao banco de dados, uma linha é inserida noItem_AUD Tabela de banco de dados.

Mas agora tenho um problema em atualizá -lo. Minha atualização na implementação do Hibernate DAO se parece:

public void updateItem(Item i) {
    SessionFactory sessionFac = HibernateUtility.getSessionFactory();
    Session s = sessionFac.getCurrentSession();
    Transaction trans = s.beginTransaction();
    s.update(i);
    s.flush();
    trans.commit();
}

Em todas as atualizações, isso é impresso no meu 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 (?, ?, ?, ?)

Mas o problema é que eu só quero inserir uma linha no REVINFO e Item_AUD Se o número do status foi alterado!

Por exemplo: eu mudei o description do item, execute a atualização com a chamada updateItem E então os Envers escrevem uma nova revisão para as tabelas de auditoria. Mas eu não quero esse comportamento.

O que eu quero: Só se o valor de status é alterado, o Envers deve gravar entradas de banco de dados nas tabelas de auditoria.

Mas como posso fazer isso?

Atenciosamente, Tim.

Foi útil?

Solução

Para isso, você tem que se estender AuditeventListener e substituir seus métodos.

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

Você pode adicionar restrições personalizadas nos outros métodos substituídos, conforme necessário. O caminho para a classe do ouvinte dentro do hibernate.cfg.xml deve ser configurado de acordo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top