As classe model são assim:
package br.com.ghnetsoft.smga.model;
import static lombok.AccessLevel.PROTECTED;
import static org.hibernate.annotations.CacheConcurrencyStrategy.NONSTRICT_READ_WRITE;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import br.com.ghnetsoft.principal.auditoria.AuditableBase;
import br.com.ghnetsoft.principal.auditoria.Principal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@ToString(of = { "id" })
@EqualsAndHashCode(of = "id", callSuper = false)
@Entity
@Setter
@Getter
@Builder
@Table(name = "TAB_PESSOA_USUARIO")
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
@Cache(usage = NONSTRICT_READ_WRITE)
@Audited
@AuditOverride(forClass = Principal.class)
@AuditTable(schema = "LOGS", value = "TAB_PESSOA_USUARIO_AUD")
public class PessoaUsuario extends AuditableBase {
private static final long serialVersionUID = -4946479448744769382L;
@Id
@Column(name = "PK_PESSOA_USUARIO")
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
@ManyToOne(targetEntity = Pessoa.class)
@JoinColumn(name = "FK_PESSOA")
private Pessoa pessoa;
@ManyToOne(targetEntity = Usuario.class)
@JoinColumn(name = "FK_USUARIO")
private Usuario usuario;
}
classe AuditableBase
package br.com.ghnetsoft.principal.auditoria;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@ToString(of = { "versao" })
@Getter
@Setter
@NoArgsConstructor
@MappedSuperclass
@EntityListeners({ Auditor.class })
public abstract class AuditableBase extends Principal {
private static final long serialVersionUID = 3026068998520990814L;
@Version
@Column(name = "NR_VERSAO")
private Integer versao;
}
Classe principal
package br.com.ghnetsoft.principal.auditoria;
import static javax.persistence.AccessType.FIELD;
import static javax.persistence.EnumType.STRING;
import static lombok.AccessLevel.PROTECTED;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Access;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Enumerated;
import javax.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedDate;
import br.com.ghnetsoft.principal.enuns.OperacacoBancoLogEnum;
import br.com.ghnetsoft.principal.enuns.SituacaoRegistroEnum;
import br.com.ghnetsoft.principal.enuns.StatusDoRegistroEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@ToString(of = { "dataHoraCadastro", "dataHoraMovimentacao", "loginMovimentacao", "ipMovimentacao", "tipoOperacao", "statusDoRegistro", "dsSituacao" })
@MappedSuperclass
@Getter
@Setter
@Embeddable
@Access(FIELD)
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
public class Principal implements Serializable {
private static final long serialVersionUID = -7494237554968808847L;
@Column(name = "TS_CADASTRO")
@CreatedDate
private LocalDateTime dataHoraCadastro;
@Column(name = "TS_MOVIMENTACAO")
private LocalDateTime dataHoraMovimentacao;
@Column(name = "CD_LOGIN_MOVIMENTACAO")
private String loginMovimentacao;
@Column(name = "IP_MOVIMENTACAO")
private String ipMovimentacao;
@Column(name = "TP_OPERACAO")
@Enumerated(STRING)
private OperacacoBancoLogEnum tipoOperacao;
@Enumerated(STRING)
@Column(name = "ST_REGISTRO")
private StatusDoRegistroEnum statusDoRegistro;
@Enumerated(STRING)
@Column(name = "ST_SITUACAO")
private SituacaoRegistroEnum dsSituacao;
}
Classe Auditor
package br.com.ghnetsoft.principal.auditoria;
import static br.com.ghnetsoft.principal.enuns.OperacacoBancoLogEnum.ALTERACAO;
import static br.com.ghnetsoft.principal.enuns.OperacacoBancoLogEnum.EXCLUSAO;
import static br.com.ghnetsoft.principal.enuns.OperacacoBancoLogEnum.INCLUSAO;
import static br.com.ghnetsoft.principal.enuns.SituacaoRegistroEnum.EM_EDICAO;
import static br.com.ghnetsoft.principal.enuns.StatusDoRegistroEnum.ATIVO;
import static java.net.InetAddress.getLocalHost;
import static java.time.LocalDateTime.now;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import java.io.Serializable;
import java.net.UnknownHostException;
import javax.annotation.PreDestroy;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import lombok.extern.slf4j.Slf4j;
@Slf4j
class Auditor implements Serializable {
private static final long serialVersionUID = 9110288632011211834L;
@PrePersist
public void auditaInclusao(final AuditableBase entidade) {
entidade.setTipoOperacao(INCLUSAO);
entidade.setDataHoraCadastro(now());
entidade.setStatusDoRegistro(ATIVO);
entidade.setDsSituacao(EM_EDICAO);
log.info(EM_EDICAO.toString());
audita(entidade);
}
@PreUpdate
public void auditaAlteracao(final AuditableBase entidade) {
entidade.setTipoOperacao(ALTERACAO);
log.info(ALTERACAO.toString());
audita(entidade);
}
@PreDestroy
public void auditaDelete(final AuditableBase entidade) {
entidade.setTipoOperacao(EXCLUSAO);
log.info(EXCLUSAO.toString());
audita(entidade);
}
private void audita(final AuditableBase entidade) {
try {
entidade.setDataHoraMovimentacao(now());
entidade.setIpMovimentacao(getLocalHost().getHostAddress());
String login = " ";
if (isNotEmpty(entidade.getLoginMovimentacao())) {
login = entidade.getLoginMovimentacao();
}
entidade.setLoginMovimentacao(login);
log.info("Loga para a classe" + getClass().getName() + " : " + entidade.getClass().getName());
} catch (final UnknownHostException e) {
log.error(e.getLocalizedMessage(), e);
}
}
}
Mas quando o sistema executa o comando
repository.delete(model)
Ele deleta do modelo, mas na auditoria, ele não inclui todas as informações, isto é, ele exclui antes de auditar.
Como fazer com que o sistema antes de deletar ele audita ?