You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hibernate Envers审计表中存储登录用户信息?

在Hibernate Envers 5.0.7中添加登录用户到审计表的实现步骤

1. 扩展审计基础表(REVINFO)结构

默认的REVINFO表仅包含版本号(REV)和时间戳(REVTSTMP),需要手动添加存储用户名的字段,例如:

ALTER TABLE REVINFO ADD COLUMN REV_USER VARCHAR(50);

2. 创建自定义Revision实体

继承Envers提供的DefaultRevisionEntity,添加用户名字段,同时通过@RevisionEntity绑定自定义监听器:

import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;
import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity extends DefaultRevisionEntity {
    @Column(name = "REV_USER")
    private String username;

    // Getter和Setter
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

3. 实现RevisionListener监听器

编写监听器类实现RevisionListener接口,在newRevision方法中从项目上下文获取当前登录用户,写入自定义Revision实体:

import org.hibernate.envers.RevisionListener;

public class CustomRevisionListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity customRevision = (CustomRevisionEntity) revisionEntity;
        // 根据项目实际的用户上下文获取用户名,以下是两种常见场景示例:
        // 1. Spring Security环境
        // String username = SecurityContextHolder.getContext().getAuthentication().getName();
        // 2. 普通Servlet会话
        // HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // String username = (String) request.getSession().getAttribute("loginUser");
        
        // 处理未登录场景,避免空指针
        customRevision.setUsername(username != null ? username : "anonymous");
    }
}

4. 配置Envers使用自定义Revision实体

在Hibernate配置文件(如hibernate.cfg.xml)中添加:

<property name="org.hibernate.envers.revision_entity_name">com.yourpackage.CustomRevisionEntity</property>

如果是Spring Boot项目,直接在application.properties中配置:

spring.jpa.properties.org.hibernate.envers.revision_entity_name=com.yourpackage.CustomRevisionEntity

5. 验证功能

执行实体的增删改操作后,检查REVINFO表的REV_USER字段,确认已正确写入当前登录用户信息。

内容的提问来源于stack exchange,提问作者Soulss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:50:41