Создание пользовательского объекта ревизии Envers

Я пытаюсь настроить аудит для нашего проекта. Я начал с конфигурации по умолчанию, которая отлично работает.

Следующим шагом является сохранение пользователя, внесшего изменения. Следуя руководству, я создал пользовательскую ревизию объекта:

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()) + ")";
}

}

А также пользовательский слушатель:

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
}

}

Вот несколько строк из лога:

DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator — создание сопоставления аудита первого прохода для объекта com.csbi.samples.domain.Property.
DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator — создание сопоставление аудита второго прохода для сущности com.csbi.samples.domain.Property.
ИНФОРМАЦИЯ: org.hibernate.cfg.HbmBinder — класс сопоставления: com.csbi.samples.domain.Property_AUD -> PROPERTIES_AUD
ИНФОРМАЦИЯ: org.hibernate.cfg.HbmBinder — класс сопоставления: org.hibernate.envers.DefaultRevisionEntity -> REVINFO

Взгляните на последнюю строку вывода. По-прежнему отображается DefaultRevisionEntity вместо CustomRevisionEntity.

Я понятия не имею, что случилось. Какие-либо предложения?


person Vyacheslav    schedule 23.11.2011    source источник
comment
Теперь... как установить имя пользователя на что-то значимое... Я не могу понять это правильно, так как понятия не имею, кто вносит изменения?!   -  person Jaco Van Niekerk    schedule 20.03.2012
comment
используйте статическую переменную для инъекции, если вы используете пружину или сервисную фабрику, если вы используете шов. 209.132.182.48/message/641790. Надеюсь, это поможет.   -  person Vyacheslav    schedule 28.03.2012


Ответы (1)


Решено. Объект не сканируется каталогом Hibernate.

person Vyacheslav    schedule 25.11.2011
comment
не могли бы вы поделиться. как вы этого добились и что вы подразумеваете под сущностью, которая не сканируется каталогом Hibernate. Потому что в моем проекте другой объект работает нормально, но не этот - person Ranu Jain; 08.08.2013
comment
Существует список пакетов в конфигурации спящего режима или в спящей части конфигурации весны, описывающий, в каких каталогах спящий режим ищет объекты. Описанного выше объекта не было в этих каталогах. - person Vyacheslav; 09.08.2013
comment
Спасибо, помогло, еще забыл добавить сущность в Hibernates SessionFactory :) - person reap; 21.10.2013