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中添加:
或者yaml格式:spring.jpa.properties.org.hibernate.envers.revision_entity_name=你的包路径.CustomRevisionEntityspring: 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
相关产品推荐
相关产品推荐

