创建Envers自定义修订实体

8

我正在尝试为我们的项目设置审计功能。 我从默认配置开始,这个配置可以正常工作。

下一步是存储进行更改的用户。 按照手册的指导,我创建了自定义实体版本:

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生成第二遍审计映射。
INFO : org.hibernate.cfg.HbmBinder - 映射类:com.csbi.samples.domain.Property_AUD -> PROPERTIES_AUD
INFO : org.hibernate.cfg.HbmBinder - 映射类: org.hibernate.envers.DefaultRevisionEntity -> REVINFO

请注意输出的最后一行。仍然映射到了DefaultRevisionEntity而不是CustomRevisionEntity

我不知道出了什么问题。有什么建议吗?


现在...如何将“用户名”设置为有意义的内容...我无法正确设置,因为我不知道是谁进行了修改?! - Jaco Van Niekerk
如果您使用Spring,则使用静态变量进行注入;如果您使用Seam,则使用服务工厂。https://209.132.182.48/message/641790。希望这有所帮助。 - Vyacheslav
1个回答

2

问题已解决。实体未被Hibernate目录扫描。


1
请问您能分享一下,您是如何实现的?并且您所说的“实体未被 Hibernate 目录扫描”是什么意思?因为在我的项目中,其他实体都可以正常工作,但是这个实体却不行。 - Ranu Jain
1
在Hibernate配置或Spring配置的Hibernate部分中,有一个包列表描述Hibernate查找实体的目录。上述实体不在那些目录中。 - Vyacheslav
1
谢谢,这很有帮助,我还忘了将实体添加到Hibernate的“SessionFactory”中 :) - reap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接