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

Envers未创建自定义修订表:部署时自动生成默认REVINFO表

解决自定义RevisionEntity未生效,系统仍生成默认REVINFO表的问题

我来帮你排查这个问题——这种情况在Hibernate Envers自定义修订实体时很常见,主要是几个配置或代码细节没做到位。先从补全监听器代码开始,再逐一排查关键配置:

首先,把你的自定义修订监听器补全并确保逻辑正确:

public class CustomRevisionEntityListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity customRevision = (CustomRevisionEntity) revisionEntity;
        // 这里根据你的权限框架获取当前登录用户,示例用Spring Security
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null && auth.isAuthenticated() && !(auth.getPrincipal() instanceof String)) {
            UserDetails userDetails = (UserDetails) auth.getPrincipal();
            customRevision.setUsername(userDetails.getUsername());
        } else {
            customRevision.setUsername("anonymous");
        }
    }
}

接下来按优先级排查以下关键问题:

1. 确保自定义修订实体被JPA扫描识别

  • 如果是Spring Boot项目,检查CustomRevisionEntity是否在@SpringBootApplication或@EntityScan指定的包路径下,JPA必须能扫描到这个实体类才能生效。
  • 传统项目则需要在persistence.xml的<class>标签里显式声明该类的全限定名。

2. 强制Envers使用自定义修订实体

这是最容易遗漏的核心配置,必须告诉Envers放弃默认的DefaultRevisionEntity:

  • Spring Boot项目:在application.properties中添加:
    spring.jpa.properties.org.hibernate.envers.revision_entity_name=你的包路径.CustomRevisionEntity
    
    或者yaml格式:
    spring:
      jpa:
        properties:
          org.hibernate.envers:
            revision_entity_name: 你的包路径.CustomRevisionEntity
    
  • 传统Hibernate配置:在hibernate.cfg.xml里添加:
    <property name="org.hibernate.envers.revision_entity_name">你的包路径.CustomRevisionEntity</property>
    

3. 校验实体类注解细节

你的实体类注解基本正确,但可以做小调整避免潜在问题:

  • 如果你不需要指定catalog,可以去掉@Table中的catalog = "molecular",避免数据库schema/catalog配置不匹配导致的表创建异常。
  • 确认@RevisionEntity(CustomRevisionEntityListener.class)中的监听器类是正确的全限定名,没有包路径错误或类名拼写错误。

4. 清理旧表与缓存

如果之前已经生成过默认的REVINFO表,Hibernate的自动建表策略(如update)不会自动替换它:

  • 手动删除数据库中的REVINFO表,再重启应用。
  • 清理Hibernate二级缓存和EntityManagerFactory缓存,确保新的实体配置被加载。

5. 排查是否有默认修订实体的残留引用

检查代码中是否还有其他类直接继承DefaultRevisionEntity,或者在Envers查询中使用了默认修订实体,这种残留引用会导致系统继续初始化默认表。

按照上述步骤逐一排查,基本就能解决系统自动生成默认REVINFO表的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:05:31