Hibernate-jpamodelgen 6.1.5.Final不会生成静态JPA元模型。

3

我知道这个问题已经被问了很多次,但是没有一个答案适用于我。

基本上,我正在尝试从我的实体中生成jpa元模型,以便在规范中使用它们。然而,尽管运行(我认为,请参见重建项目输出截图),Hibernate JPA 2 Static-Metamodel Generator 6.1.5.Final没有在注释文件夹中生成任何类。

有人能帮帮我吗?(PS对不起我不能发布截图,因为stackoverflow不让我)

我正在使用java 19,sping 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的注解处理器设置:

我无法发布图片,但启用注解处理已经被选中,以及从项目类路径获取处理器,路径为目标\生成源\注解模块内容根目录中。

重新构建项目后,目标文件夹出现并包含一个名为generated-sources的文件夹。这个generated-sources包含一个名为annotations的文件夹,但里面什么也没有(但应该包含类Test_)。

Annotations文件夹也被设置为源文件夹。

我阅读了一些之前的帖子,但对我都没有用。我还阅读了文档(doc),但它仍然不起作用。


你尝试过定义一个 persistence.xml 文件吗?Spring 动态生成它,从它在类路径中找到的所有内容和筛选出进入其中的内容的机制中,但 JPA 规范需要一个 persistence.xml。Hibernate 也可能如此。 - Chris
你好,感谢您的回复,但我已经找到了解决方案(请参见答案部分)。如果您知道为什么它有效的答案,请随时回复 :) - Joachim
4个回答

3
我找到了两个解决方案,但不明白为什么它们有效(我猜我很幸运)。如果有解释的话,那就太好了 :)
  1. 第一个解决方案

直接在依赖项中使用Hibernate的版本5.6.12.Final。如果将其升级到版本6.1.5.Final(如IntelliJ建议的那样),则元模型不会生成,但我不知道原因...

Dependency

第二种解决方案:
将依赖设置为最新版本(这里是6.1.5.Final),但在构建中添加一个插件,其中annotationProcessorPaths使用版本5.6.12.Final。

annotationProcessorPaths

PS:我不明白为什么变量${hibernate.version}被设置为版本5.6.12.Final,而我在依赖项中设置了我的Hibernate版本为6.1.5.Final。任何解释都将是很好的 :)

${hibernate.version} 只是在你的文件中其他地方定义为5.6.12的 'hibernate.version' 变量。插件配置中的此路径定义明确定义了要使用哪个构件/版本,因此它会选择并使用5.6.12而不是先前依赖项的jar包。你正在给它一个路径,所以它必须按照你指定的文件来使用。最佳实践是在文件开头指定 hibernate.version 属性,并在需要版本的任何地方都使用它,而不是在选择版本标签中硬编码它。至于其余部分,我不清楚。 - Chris
你是否已经将实体转换为使用Jakarta打包的JPA注释,还是仍在使用javax? - Chris
我遇到了类似的问题(未解决)。需要注意的一点是,版本6.1.5.Final的groupId现在是org.hibernate.orm而不是org.hibernate。你导入5.6.12的原因是因为你依赖于spring-boot 2.7.5。 - Bruce Stewart

0

将版本更新为spring boot 3.0.3-SNAPSHOT 对我来说很有效。

父级部分

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.3-SNAPSHOT</version>
    <relativePath/>
</parent>

模型生成相关依赖

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

<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>6.1.7.Final</version>
</dependency>

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>

0
如果你还在使用"javax.persistence.X"包,那么请将它们更新为"jakarta.persistence.X"。

0

尝试使用 hibernate-jpamodelgen-jakarta:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-jpamodelgen-jakarta</artifactId>
  <version>5.6.15.Final</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接