8

I'm trying to setup audit for our project. I started from the default configuration which works fine.

The next step is to store the user which has made changes. Following the manual I created custom entity revision:

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

}

And also custom listener:

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
}

}

Here is some lines from log:

DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator - Generating first-pass auditing mapping for entity com.csbi.samples.domain.Property.
DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator - Generating second-pass auditing mapping for entity com.csbi.samples.domain.Property.
INFO : org.hibernate.cfg.HbmBinder - Mapping class: com.csbi.samples.domain.Property_AUD -> PROPERTIES_AUD
INFO : org.hibernate.cfg.HbmBinder - Mapping class: org.hibernate.envers.DefaultRevisionEntity -> REVINFO

Take a look at the last line of the output. There is still DefaultRevisionEntity mapped instead of CustomRevisionEntity.

I have no idea what is wrong. Any suggestions?

skaffman
  • 398,947
  • 96
  • 818
  • 769
Vyacheslav
  • 3,134
  • 8
  • 28
  • 42
  • Now... how do set "username" to something meaningful... I cannot get that right as I have no idea who is making the modification?! – Jaco Van Niekerk Mar 20 '12 at 14:11
  • use static variable for injection if you use spring or service factory if you use seam. https://209.132.182.48/message/641790. Hope that helps. – Vyacheslav Mar 28 '12 at 07:40

1 Answers1

2

Solved. Entity is not in scanned by Hibernate directory.

Vyacheslav
  • 3,134
  • 8
  • 28
  • 42
  • 1
    can you please share . how you achieved this and what do u mean by Entity is not in scanned by Hibernate directory. Because in my project other entity is working fine but not this one – Ranu Jain Aug 08 '13 at 09:31
  • 1
    There is a list of packages in hibernate config or in hibernate part of spring config describing in which directories hibernate looks for an entities. The Entity described above was not in that directories. – Vyacheslav Aug 09 '13 at 11:49
  • 1
    Thanks, this helped, I also forgot to add the entity to Hibernates `SessionFactory` :) – reap Oct 21 '13 at 04:33