Hibernate-jpamodelgen 6.1.5.Final无法生成JPA静态元模型
我知道这个问题被问过很多次,但之前的答案都解决不了我的问题。我正尝试从实体生成JPA静态元模型用于Specification,但项目重建成功后,Hibernate JPA 2 Static-Metamodel Generator 6.1.5.Final并没有在annotations文件夹生成任何类。
环境:
- Java 19
- Spring Boot 2.7.5
- Maven
- IntelliJ
实体类(Test.java):
package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Test { @Id private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } }
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <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>2.7.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>19</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.1.5.Final</version> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
项目重建输出:
Clearing build system data... Executing pre-compile tasks... Cleaning output directories… Running 'before' tasks Checking sources Copying resources... [demo] Parsing java… [demo] java: Hibernate JPA 2 Static-Metamodel Generator 6.1.5.Final Writing classes… [demo] Updating dependency information… [demo] Adding @NotNull assertions… [demo] Adding pattern assertions… [demo] Adding Threading Model assertions… [demo] Parsing java… [tests of demo] Writing classes… [tests of demo] Updating dependency information… [tests of demo] Adding @NotNull assertions… [tests of demo] Adding pattern assertions… [tests of demo] Adding Threading Model assertions… [tests of demo] Running 'after' tasks javac 19 was used to compile java sources Finished, saving caches… Executing post-compile tasks... Finished, saving caches… Synchronizing output directories... 06-11-22 14:37 - Build completed successfully in 3 sec, 464 ms
IntelliJ注解处理器设置:
已勾选「Enable annotation processing」和「Obtain processors from project classpath」,生成路径设为模块根目录下的target\generated-sources\annotations。重建后target/generated-sources/annotations已被标记为源文件夹,但该文件夹为空,本该生成Test_类。
我已经查过相关帖子和官方文档,但问题还是没解决。
试试下面几个步骤,应该能解决问题:
调整hibernate-jpamodelgen的依赖范围
把hibernate-jpamodelgen的依赖加上provided范围,避免打包时带入,同时确保编译时能正确调用处理器:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.1.5.Final</version> <scope>provided</scope> </dependency>在Maven中显式配置注解处理器
光靠依赖有时候Maven不会自动触发处理器,需要在maven-compiler-plugin里明确指定:
在pom.xml的<build><plugins>里添加:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.1.5.Final</version> </path> </annotationProcessorPaths> <source>19</source> <target>19</target> </configuration> </plugin>清理并重新构建项目
- 先执行Maven命令:
mvn clean compile,强制触发编译和注解处理 - 如果用IntelliJ,执行「File → Invalidate Caches...」,然后重启IDE,再重新构建
- 先执行Maven命令:
检查JPA注解的包名
Hibernate 6.x用的是Jakarta EE的注解(jakarta.persistence.*),而你的实体类用的是旧的javax.persistence.*。虽然Spring Boot 2.7.x兼容javax,但最好换成Jakarta的注解,避免处理器识别问题:import jakarta.persistence.Entity; import jakarta.persistence.Id;检查IntelliJ的生成路径权限
确保target/generated-sources/annotations目录有读写权限,有时候IDE权限问题会导致生成的文件被隐藏或无法写入。
按上面的步骤逐一排查,应该能生成Test_元模型类。
内容的提问来源于stack exchange,提问作者Joachim

