Estoy intentando configurar la auditoría para nuestro proyecto. Empecé con la configuración predeterminada que funciona bien.Creación de la entidad de revisión personalizada Envers
El siguiente paso es almacenar al usuario que ha realizado cambios. Siguiendo el manual he creado a medida entidad de revisión:
package com.csbi.samples.utils.audit;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.Date;
import org.hibernate.envers.RevisionNumber;
import org.hibernate.envers.RevisionTimestamp;
import org.hibernate.envers.RevisionEntity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
@Entity
@Table(name="REVISIONS")
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity implements Serializable {
private static final long serialVersionUID = -1255842407304508513L;
@Id
@GeneratedValue
@RevisionNumber
private int id;
@RevisionTimestamp
private long timestamp;
private String username;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Transient
public Date getRevisionDate() {
return new Date(timestamp);
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean equals(Object o) {
if(this == o) return true;
if(!(o instanceof CustomRevisionEntity)) return false;
CustomRevisionEntity that = (CustomRevisionEntity) o;
if(id != that.id) return false;
if(timestamp != that.timestamp) return false;
if(timestamp != that.timestamp) return false;
if(username != that.username) return false;
return true;
}
public int hashCode() {
int result;
result = id;
result = 31 * result + (int) (timestamp^(timestamp >>> 32));
return result;
}
public String toString() {
return "DefaultRevisionEntity(user = " + username + "id = " + id + ", revisionDate = " + DateFormat.getDateTimeInstance().format(getRevisionDate()) + ")";
}
}
Y también escucha personalizado:
package com.csbi.samples.audit;
import org.hibernate.envers.RevisionListener;
public class CustomRevisionListener implements RevisionListener {
public void newRevision(Object revisionEntity) {
CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
revision.setUsername("username"); //for testing
}
}
Aquí es algunas líneas de registro:
DEBUG: org .hibernate.envers.configuration.metadata.AuditMetadataGenerator - Generando first-p Mapeo de auditoría de culo para la entidad com.csbi.samples.domain.Property.
DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator - Generación de asignación de auditoría del segundo paso para la entidad com.csbi.samples.domain.Property.
INFORMACIÓN: org.hibernate.cfg.HbmBinder - clase Mapping: com.csbi.samples.domain.Property_AUD -> PROPERTIES_AUD
INFORMACIÓN: org.hibernate.cfg.HbmBinder - clase Mapping: org.hibernate.envers. DefaultRevisionEntity -> REVINFO
Eche un vistazo a la última línea de la salida. Todavía hay DefaultRevisionEntity
asignado en lugar de CustomRevisionEntity
.
No tengo idea de lo que está mal. ¿Alguna sugerencia?
Ahora ... ¿cómo se establece el "nombre de usuario" a algo significativo ... No puedo hacerlo bien, ya que no tengo idea de quién está haciendo la modificación? –
use la variable estática para inyección si usa un resorte o servicio de fábrica si usa costura. https://209.132.182.48/message/641790. Espero que ayude. – Vyacheslav