带有 Hibernate 的 JavaFX 桌面应用程序 - 无法识别 @Entity 和其他注释

Posted

技术标签:

【中文标题】带有 Hibernate 的 JavaFX 桌面应用程序 - 无法识别 @Entity 和其他注释【英文标题】:JavaFX Desktop App with Hibernate - @Entity and other annotations are not recognized 【发布时间】:2021-12-01 11:42:43 【问题描述】:

所以,我决定用 Hibernate 和 JavaFX 制作一个项目。 我已经设计了 UI 并在我用 Maven 创建的项目中对其进行了测试,使用名为“javafx-archetype-fxml”的原型,它工作得很好。 现在我正在尝试将 Hibernate 添加到这个项目中来管理持久层。 我在 Maven 中添加了依赖项,“hibernate-core”v.6.0.0 并继续使用“@Entity”类型注释映射模型类,但 VSCode 无法识别它们。也许我需要在 module-info.java 中添加一个模块?

@Entity 注解无法识别。

这是我的 pom.xml 文件:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>6.0.0.Beta1</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>13</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>13</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <mainClass>com.ignaciocassi.App</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

这是我的 module-info.java 文件:

module com.ignaciocassi 
    requires javafx.controls;
    requires transitive javafx.graphics;
    requires javafx.fxml;
    requires java.sql;
    opens controllers to javafx.fxml;
    exports com.ignaciocassi;
 

我是 Maven 和模块化项目的新手,我想学习。任何建议或帮助将不胜感激。

【问题讨论】:

所有这些信息都非常有用,尽管我仍然不知道如何根据我想要使用的功能检查我必须添加的模块。在这种情况下,jakarta.persistence 模块添加了 JPA 注释。我在 Hibernate ORM 指南上找不到任何提及。不管怎样,你的帮助真的很有用,谢谢@jewelsea。 用答案替换了 cmets。 【参考方案1】:

此答案是从 cmets 中获取一些附加信息并添加到答案中并添加更多上下文信息。它是对self-answer 的补充,已经注意到:

真正为我解决的是将“需要 jakarta.persistence”添加到提供 JPA 注释的 Module-info.java 中。

为什么要求jakarta.persistence 允许@Entity 访问

@Entity 注释用于 JPA,而不是 hibernate(尽管 hibernate 可以使用它)。 Hibernate 6 依赖 jakarta 3 来提供 @Entity 定义,它从 jakarta.persistence module 中的 jakarta.persistence package 获得。

requires jakarta.persistence 子句添加到您的module-info.java 文件允许访问该模块导出的类型(包括@Entity 类型)。

注意,如果您使用其他 JPA 功能(如条件),它们可以位于同一模块中的不同包中。因此,即使您使用 jakarta.persistence.criteria 包中的注释,只需要 jakarta.persistence 模块就足够了,因为该模块还包含条件包。

Hibernate 的其余部分呢

我可以在网上找到一些关于使用 Hibernate 6 可能需要在 module-info.java 中放置什么的具体信息。据我所知,current Hibernate 6 documentation 没有提到它(我相信这是文档中的一个缺点)。

请注意,Hibernate 经常与其他技术一起使用,特别是 Spring Data JPA。如果您现在或将来正在考虑在您的应用程序中使用 Spring 技术(我建议您使用直接的休眠集成)。只有当Spring 6 and SpringBoot 3 发布时,Spring 才会真正与 JPMS 模块系统很好地集成。因此,尽管您可以让当前的 Spring 应用程序与 JPMS 一起工作,但我建议您以非模块化方式部署您的应用程序(请参阅下面的信息)并运行一些非模块化库,例如任何 Spring 库(也许还有 hibernate-core)脱离类路径。

了解 JPMS 模块

为了帮助理解模块:请参阅Understanding Java 9 Modules - What they are and how to use them,这是对 Java 平台模块系统 (JPMS) 的基本介绍,如果需要,您可以从那里进行一些独立的研究和学习以获取更多信息。

非模块化 JavaFX 应用程序

另外请注意,您也许可以避免这些问题,但使您的应用程序非模块化(即不要在您的应用程序中提供module-info.java 文件)。 核心 JDK 类和 JavaFX 本身应该在模块路径之外运行,但是您的应用程序和它使用的其他依赖库可以:

    您的应用程序可以是模块化的并在模块路径之外运行
在您的应用程序中包含一个module-info.java 文件。
    或者,您的应用程序可以是非模块化的。
不包含module-info.java 文件。

对于非模块化应用程序,您的应用程序类和依赖库可以在类路径而不是模块路径之外运行。

有关这方面的更多信息,请参阅openjfx.io getting started guide,其中讨论了用于常见 IDE 设置的模块化和非模块化应用程序以及可部署运行时映像的创建。

部署非模块化应用程序的缺点是您失去了模块化提供的一些好处(例如更严格的访问控制)。但对于某些应用程序,这是一个合适的部署目标。

您的 Maven 设置的其他潜在问题

我认为pom 的依赖类型是错误的。可能不应该有任何类型。我认为pom 类型仅用于在dependencyManagement section of the maven project file 中导入物料清单。在the Baeldung spring maven bom tutorial 中讨论了pom 类型的用法。我可能是错的,pom 类型可能还有其他用途,但提供的信息是我目前的理解。

您正在使用 beta hibernate 软件,这可能没问题,并且实际上可能与 JPMS 模块一起工作得更好,但请注意这一点。

hibernate-core 仍可在 org.hibernate 中找到,但版本 6 已移至 org.hibernate.orm,因此在旧组下可能找不到未来版本。

【讨论】:

【参考方案2】:

对于以后遇到和我一样问题的人,我建议按照@jewelsea 的建议阅读Understanding Java 9 Modules - What they are and how to use them。

真正为我解决的是将“需要 jakarta.persistence”添加到提供 JPA 注释的 Module-info.java 中。

【讨论】:

接下来您需要将模块打开到休眠模块或使模块成为开放模块,因为休眠需要访问实体类的内部才能正常运行。【参考方案3】:

尝试添加 Spring data JPA maven 依赖,因为 @Entity 注解需要 javax.persistence 包。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.5.5</version>
</dependency>

【讨论】:

以上是关于带有 Hibernate 的 JavaFX 桌面应用程序 - 无法识别 @Entity 和其他注释的主要内容,如果未能解决你的问题,请参考以下文章

带有 SWING 与 JavaFX 的 Java 用户界面

打包JavaFX11桌面应用程序

java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?

如何在 JavaFX 中将 CheckBox 添加到 TableView

JavaFX TabPane:如何设置选定的选项卡

使用JavaFX开发桌面程序