2011-11-23 13 views
8

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?

+0

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? –

+0

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

Respuesta

1

Resuelto. La entidad no está escaneada por el directorio de Hibernate.

+1

puede por favor compartir. cómo lo logró y lo que quiere decir con Entity no está escaneado por el directorio de Hibernate. Porque en mi proyecto otra entidad funciona bien, pero no esta –

+1

Hay una lista de paquetes en hibernate config o en hibernate parte de spring config que describe en qué directorios hibernate busca entidades. La Entidad descrita arriba no estaba en esos directorios. – Vyacheslav

+1

Gracias, esto ayudó, también olvidé agregar la entidad a Hibernates 'SessionFactory' :) – reap

Cuestiones relacionadas