如何在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
相关产品推荐
相关产品推荐

