Hibernate - envers -> Auditoria / versão de um atributo, mas apenas se o valor foi alterado
-
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.
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.