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

使用org.hibernate.envers时无法解析QDefaultRevisionEntity符号

Hibernate Envers与Querydsl生成类编译错误解决

错误现象

编译时报错:

java: cannot find symbol
  symbol:   class QDefaultRevisionEntity
  location: package org.hibernate.envers

同时生成的QCustomRevisionEntity文件中存在无法解析符号timestamp、id和QDefaultRevisionEntity的问题。

自定义修订实体代码

import jakarta.persistence.Entity;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;
import jakarta.persistence.*;

@Setter @Getter
@Entity
@Table(name = "")
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity extends DefaultRevisionEntity {
    private Integer authenticatedUserId;
}

生成的QCustomRevisionEntity代码

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
 * QCustomRevisionEntity is a Querydsl query type for CustomRevisionEntity
 */
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QCustomRevisionEntity extends EntityPathBase<CustomRevisionEntity> {

    private static final long serialVersionUID = -697850477L;

    public static final QCustomRevisionEntity customRevisionEntity = new QCustomRevisionEntity("customRevisionEntity");

    public final org.hibernate.envers.QDefaultRevisionEntity _super = new org.hibernate.envers.QDefaultRevisionEntity(this);

    public final NumberPath<Integer> authenticatedUserId = createNumber("authenticatedUserId", Integer.class);

    //inherited
    public final NumberPath<Integer> id = _super.id;

    //inherited
    public final NumberPath<Long> timestamp = _super.timestamp;

    public QCustomRevisionEntity(String variable) {
        super(CustomRevisionEntity.class, forVariable(variable));
    }

    public QCustomRevisionEntity(Path<? extends CustomRevisionEntity> path) {
        super(path.getType(), path.getMetadata());
    }

    public QCustomRevisionEntity(PathMetadata metadata) {
        super(CustomRevisionEntity.class, metadata);
    }

}

项目pom.xml配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>redacted</groupId>
    <artifactId>redacted</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>redacted</name>
    <packaging>war</packaging>
    <description>Redacted</description>
    <properties>
        <java.version>19</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--            <scope>runtime</scope>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>org.hibernate</groupId>-->
<!--            <artifactId>hibernate-envers</artifactId>-->
<!--&lt;!&ndash;            <version>${hibernate.version}</version>&ndash;&gt;-->
<!--        </dependency>-->
        <!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-envers -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-envers</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.hibernate</groupId>-->
<!--            <artifactId>hibernate-core</artifactId>-->
<!--            <version>6.3.0.Final</version>-->
<!--            <type>pom</type>-->
<!--        </dependency>-->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-envers -->

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <type>maven-plugin</type>
        </dependency>


        <dependency>
            <groupId>org.awaitility</groupId>
            <artifactId>awaitility</artifactId>
            <version>3.1.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.darrachequesne</groupId>
            <artifactId>spring-data-jpa-datatables</artifactId>
            <version>6.0.1</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-webmvc</artifactId>-->
<!--            <version>6.0.4</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.0.11</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${project.parent.version}</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>16</source>
                    <target>16</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

解决方案

  • 问题根源:Hibernate Envers 6.x版本移除了QDefaultRevisionEntity类,Querydsl生成器无法自动识别继承自DefaultRevisionEntity的字段;同时pom中未定义${hibernate.version},可能导致依赖版本不一致。
  • 修复步骤:
    1. 统一Hibernate版本:在pom的<properties>中添加<hibernate.version>6.2.7.Final</hibernate.version>(与Spring Boot 3.1.2默认兼容),避免版本冲突。
    2. 重构自定义修订实体:不再继承DefaultRevisionEntity,手动定义id和timestamp字段,使用Envers注解标记:
      import jakarta.persistence.Entity;
      import jakarta.persistence.GeneratedValue;
      import jakarta.persistence.Id;
      import jakarta.persistence.Table;
      import lombok.Getter;
      import lombok.Setter;
      import org.hibernate.envers.RevisionEntity;
      import org.hibernate.envers.RevisionNumber;
      import org.hibernate.envers.RevisionTimestamp;
      
      @Setter @Getter
      @Entity
      @Table(name = "REVINFO")
      @RevisionEntity(CustomRevisionListener.class)
      public class CustomRevisionEntity {
          @Id
          @GeneratedValue
          @RevisionNumber
          private Integer id;
      
          @RevisionTimestamp
          private Long timestamp;
      
          private Integer authenticatedUserId;
      }
      
    3. 清理并重新生成代码:删除generated-source目录下的旧文件,执行mvn clean compile重新生成Querydsl类。
    4. 检查Querydsl依赖:确保项目包含querydsl-jpa依赖及相关代码生成插件,保证生成器能正确处理实体类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:19:50